2

在我的程序中,我递归地遍历一个嵌套列表并将元素添加到我将返回的整个列表中。有一些细节需要注意,所以我不能只使用unlist.

formulaPart被视为一个公式对象

我的代码是:

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 中处理这个错误。

4

1 回答 1

4

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
于 2013-05-21T17:38:22.620 回答