2015-08-26 7 views
0

Предположим у меня есть следующие функции:Присвоить элемент списка в родительском фрейме

f1 <- function() 
{ 
    get.var <- function(v) 
    { 
    for(n in 1:sys.nframe()) 
    { 
     varName <- deparse(substitute(v, env = parent.frame(n))) 
     if(varName != "v") 
     { 
     break 
     } 
    } 
    return(list(name = varName, n = n)) 
    } 

    f2 <- function(v) 
    { 
    print(v) 
    # get original variable name and environment 
    obj <- get.var(v) 
    #below doesn't work as expected - this is where q$a and q$b would be updated 
    assign(obj$name, v + 1, env = parent.frame(obj$n)) 
    } 

    f3 <- function(v){ f2(v) } 
    f4 <- function(v){ f3(v) } 

    q <- list(a = 2, b = 3) 

    f4(q$a) 
    f3(q$b) 
} 

Как я могу обновить значение q$a и q$b от f2? Ситуация заключается в том, что аналогичная процедура вызывается в некоторых из моего кода для проверки количества аргументов во вложенном списке. Если значение неверно, элемент списка необходимо обновить, чтобы отобразить правильное значение. Это, безусловно, уродливый способ сделать это, но, к сожалению, я не могу передать весь список каждой функции проверки.

Вопрос был несколько схожий вопрос был задан here, но вместо этого пользователь проходил элемент списка.

+2

Вы можете попробовать 'q $ b << - TRUE'. – cryo111

+0

Хорошая точка. Я обновил код, чтобы вы могли понять, почему это невозможно в этом случае. – ruser45381

ответ

0

Вместо использования assign(obj$name, v + 1, env = parent.frame(obj$n)) я заменил это с eval(parse(text = sprintf("%s <- %d", obj$name, v + 1)), envir = parent.frame(obj$n))

Это чудовищно уродливые, но это работает.

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