Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在列表矩阵中找到正确的递归顺序_R_Recursion_Matrix - Fatal编程技术网

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

R 在列表矩阵中找到正确的递归顺序,r,recursion,matrix,R,Recursion,Matrix,这与我的另一个问题有关,可能会帮助我找到解决方案。以下结构是一个3x1矩阵,每个元素包含一个列表 cb <- structure(list(c("apples", "and", "pears"), c("one", "banana" ), c("pears", "oranges", "and", "pizza")), .Dim = c(3L, 1L), .Dimnames = list(NULL, "s")) 这是手工操作的方法 `length<-`(

这与我的另一个问题有关,可能会帮助我找到解决方案。以下结构是一个3x1矩阵,每个元素包含一个列表

cb <- structure(list(c("apples", "and", "pears"), c("one", "banana"
      ), c("pears", "oranges", "and", "pizza")), .Dim = c(3L, 1L),   
      .Dimnames = list(NULL, "s"))
这是手工操作的方法

`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"
但是这会将
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

replicate(3,引号(`length不知道这是否是您要找的,但我想试试:

    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"  
这和

unlist(lapply(cb, `length<-`, 4L))
# [1] "apples"  "and"     "pears"   NA        "one"     "banana"  NA       
# [8] NA        "pears"   "oranges" "and"     "pizza"  

unlist(lappy(cb,`lengthSomegthing
lappy(cb,函数(x){if(length(x)<4){append(x,rep(NA,times=4-length(x)))}else{x})
?哦,我忘了提到…没有
*应用
函数。我要添加它。
中有
递归
参数,我知道它们是用于此目的的。我想学习如何使用them@jdharrison-我倾向于在
cb[[1:3]]中使用递归
,但你不能这样做。但是还有其他的事情,比如
cb[[1,exact=TRUE]]
cb[[1,1,exact=TRUE]]
cb[[c(1,2)]]
这可能很有趣。为什么要递归?这里有一个嵌套级别。是否有更好的示例说明需要递归的地方?嵌套元素的级别已知的地方?感谢您的想法,但是
eval(parse(text=…)
可能会有问题,不建议使用它。会有什么问题?一个小例子是
x当然,如果文本中有语法错误,它会有问题。但我不认为
eval(parse())
可能会有不可预测的行为。如果是这样,你怎么可能
源文件
呢?你看过
x
了吗?那里没有语法错误。
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"  
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"