r-在列表矩阵中找到正确的递归顺序



这与我的另一个问题有关,可能会帮助我找到解决方案。下面的结构是一个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包含多少行(列表元素)。unlistc中都有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"  

我仍然对其他可能性持开放态度!

最新更新