这与我的另一个问题有关,可能会帮助我找到解决方案。下面的结构是一个3x1矩阵,每个元素都包含一个列表。
cb <- structure(list(c("apples", "and", "pears"), c("one", "banana"
), c("pears", "oranges", "and", "pizza")), .Dim = c(3L, 1L),
.Dimnames = list(NULL, "s"))
我想递归地分配4作为每个矩阵元素的长度,然后将它们全部连接起来,这样结果就是
# [1] "apples" "and" "pears" NA "one" "banana"
# [6] NA NA "pears" "oranges" "and" "pizza"
这是手动操作的方法。
`length<-`(cb[[1]],4)
# [1] "apples" "and" "pears" NA
`length<-`(cb[[2]],4)
# [1] "one" "banana" NA NA
`length<-`(cb[[3]],4)
# [1] "pears" "oranges" "and" "pizza"
我想在不循环的情况下完成这项工作,可以使用递归或编写bquote
表达式。我想我需要使用do.call
,但我想不出正确的方法。我现在的代码是
do.call(`length<-`, list(c(cb, recursive=TRUE), 12))
# [1] "apples" "and" "pears" "one" "banana" "pears"
# [6] "oranges" "and" "pizza" NA NA NA
但这会将NA
值附加到连接向量的末尾,我想递归地附加它们,因为我可能不知道cb
包含多少行(列表元素)。unlist
和c
中都有recursive =
自变量,可能需要在此处使用这些自变量。
将x
替换为当前列表级别的答案(如下面所示)将起作用。
replicate(3, quote(`length<-`(cb[[x]], 4L)))
#[[1]]
#`length<-`(cb[[x]], 4L) # x = 1
#
#[[2]]
#`length<-`(cb[[x]], 4L) # x = 2
#
#[[3]]
#`length<-`(cb[[x]], 4L) # x = 3
不知道这是否是您想要的,但我会尝试一下:
eval(parse(text=paste(sep="","c(",paste(sep="","cb[[",1:length(cb),"]][1:4]",collapse=","),")")))
[1] "apples" "and" "pears" NA "one" "banana" NA
[8] NA "pears" "oranges" "and" "pizza"
这里有两种可能的方法,flodel(在注释中)的第一种方法效果很好。
resize.recursive <- function(x, len = 4L)
{
if (!length(x)) NULL
else c(`length<-`(x[[1]], len),
Recall(x[-1, , drop = FALSE], len))
}
resize.recursive(cb)
# [1] "apples" "and" "pears" NA "one" "banana" NA
# [8] NA "pears" "oranges" "and" "pizza"
在这一次,我在循环中咬紧牙关,选择了lapply
replaceLength <- function(x, lev, len = 4L) `length<-`(x[[lev]], len)
unlist(lapply(1:3, replaceLength, x = cb))
# [1] "apples" "and" "pears" NA "one" "banana" NA
# [8] NA "pears" "oranges" "and" "pizza"
与相同
unlist(lapply(cb, `length<-`, 4L))
# [1] "apples" "and" "pears" NA "one" "banana" NA
# [8] NA "pears" "oranges" "and" "pizza"
我仍然对其他可能性持开放态度!