2013-05-21 3 views
2

В моей программе я рекурсивно перебираю вложенный список и добавляю элементы в общий список, который я верну. Есть несколько деталей, о которых нужно позаботиться, поэтому я не могу просто использовать unlist.Рекурсивно редактирование списка в R

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.

+0

Не могли бы вы предоставить некоторые примеры данных для работы? –

+0

Ну, вы не сохраняете результат от внутреннего вызова 'parseVariables'. Попробуйте изменить 'parseVariables (currentVar, myList)' to 'result <- parseVariables (currentVar, myList)' и 'list <- c (list, currentVar)' to 'list <- c (result, currentVar)'. И вы также должны добавить окончательную строку для результата функции, что не совсем ясно в приведенной выше форме. –

+0

Я пробовал это, и он говорит, что результат «объекта» «не найден». Если я сохраню внутренний вызов 'parseVariables', чтобы получить результат, как будет выглядеть' list <- c (result, currentVar) '. Они находятся в разных ветвях выражения if-else. –

ответ

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 
+0

Спасибо. Передача по ссылке - именно то, что мне нужно. –

Смежные вопросы