Рекурсивное редактирование списка в R


В моей программе я рекурсивно просматриваю вложенный список и добавляю элементы в общий список, который я верну. Есть несколько деталей, о которых нужно позаботиться, поэтому я не могу просто использовать 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.

1 2

1 ответ:

R делает что-то вроде pass-by-value, поэтому вы не можете изменить (большинство) существующих объектов, просто передав их в функцию. Если вы хотите добавить что-то рекурсивно, один трюк будет заключаться в использовании среды, которая передается по ссылке. Это можно легко заставить перечислить, когда вы закончите.

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