【问题标题】:Recursively editing a list in R递归编辑R中的列表
【发布时间】:2013-05-21 16:59:11
【问题描述】:

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

【问题讨论】:

  • 您能提供一些示例数据吗?
  • 好吧,你没有将内部调用的结果保存到parseVariables。尝试将parseVariables(currentVar, myList) 更改为result &lt;- parseVariables(currentVar, myList) 并将list &lt;- c(list, currentVar) 更改为list &lt;- c(result, currentVar)。并且你还应该为函数结果添加最后一行,这在上面的表格中不是很清楚。
  • 我试过了,它说object 'result' not found。如果我将parseVariables 的内部调用保存到结果中,list &lt;- c(result, currentVar) 将如何使用它。它们位于 if-else 语句的不同分支中。
  • @Matthew,几乎任何公式都可以。这个想法是,该函数将公式中的所有非纯符号元素添加到列表中。例如,如果 formula = y ~ x + z 则列表应包含 3 个新元素 - y, x, z。省略的各种字符是标准符号,例如'+', '-', ':'
  • 其他评论者(和我自己)在这里苦苦挣扎的是,这个问题让我们感觉像是在向我们展示一些更大的任务,并且很难诊断问题并提出建议解决方案,除非我们有一个完整的、可重复的示例,我们可以自己运行。

标签: r recursion formula


【解决方案1】:

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

【讨论】:

  • 谢谢。通过引用传递正是我所需要的。
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多