Рекурсивное редактирование списка в 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 ответ:
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