在我的程序中,我递归地遍历嵌套列表并将元素添加到我将返回的整个列表中。有一些细节需要注意,所以我不能只使用unlist
。
formulaPart
被视为formula object。
我的代码是:
parseVariables <- function(formulaPart, myList){
for(currentVar in as.list(formulaPart))
if(typeof(currentVar == 'language'
parseVariables(currentVar, myList)
else
if(! toString(currentVar) %in% c(\\various characters)
list <- c(list, currentVar)
}
我已经检查过该函数应该正确地将元素添加到列表中。问题是列表由于递归而丢失元素。在一次内部递归调用期间添加的元素不会保存用于另一个递归调用。
如果这是在C ++中,我可以使用指针; Java也一样。但是,我不明白如何在R中处理这个错误。
答案 0 :(得分:2)
R执行类似值传递的操作,因此您不能仅通过将现有对象传递给函数来修改(大多数)现有对象。如果你想以递归方式添加某些东西,一个技巧就是使用一个环境,它通过引用传递。完成后很容易被强制列出。
parseVariables <- function(formulaPart, myList){
for(currentVar in as.list(formulaPart)) {
if(typeof(currentVar) == 'language') {
parseVariables(currentVar, myList)
}
else {
if(! toString(currentVar) %in% c(':', '+', '~'))
assign(toString(currentVar), currentVar, myList)
}
}
}
f1 <- z ~ a:b + x
f2 <- z ~ x + y
myList <- new.env()
parseVariables(f1, myList)
parseVariables(f2, mylist)
ls(myList)
# [1] "a" "b" "x" "z"
as.list(myList)
# $x
# x
#
# $z
# z
#
# $a
# a
#
# $b
# b