R 在列表矩阵中找到正确的递归顺序
这与我的另一个问题有关,可能会帮助我找到解决方案。以下结构是一个3x1矩阵,每个元素包含一个列表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<-`(
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,`lengthSomegthinglappy(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"