递归编辑R中的列表

时间:2013-05-21 16:59:11

标签: r recursion formula

在我的程序中,我递归地遍历嵌套列表并将元素添加到我将返回的整个列表中。有一些细节需要注意,所以我不能只使用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中处理这个错误。

1 个答案:

答案 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
相关问题