Подтвердить что ты не робот

Почему не присваивается() значения элементу списка в R?

Я пытаюсь использовать значения назначения в объекте в списке. Я хочу изменить некоторые элементы. Например:

x <- list()
x$test <- 1
assign("x$test", 2)
x$test == 1
     [1] TRUE

Любые мысли? Мне нужно использовать назначение, потому что я создаю функцию, которая будет принимать имена объектов в списке (x) в качестве входов.

4b9b3361

Ответ 1

Похоже, вам не повезло. Из файла справки:

'присваивание не отправляет методы назначения, поэтому его нельзя использовать для установить элементы векторов, имена, атрибуты и т.д.

Обратите внимание, что назначение связанного списка или кадра данных изменяет прикрепленную копию, а не оригинальный объект: см. "attach and" with.

Если вы передаете names(x) в качестве ввода, вы не могли бы использовать:

nms <- names(x)
for ( n in nms )
    x[[n]] <- 'new_value'

Также вы намерены изменить свою функцию на какую-либо глобальную переменную? например:.

x <- list(test=1)

f <- function(...)
   x$test <- 2

f() # want x$test = 2 ??

Потому что это не сработает (проблемы с областью). Вы можете заставить его работать с небольшим количеством ног (<<-), но это обычно считается плохой практикой, так как легко вставлять непреднамеренные ошибки в ваш код.

Если вы могли бы привести пример того, зачем вам нужна эта функция/какая цель она будет служить, мы могли бы помочь вам найти альтернативное решение.

Ответ 2

Посмотрите, что произойдет, когда вы назначаете "x $test":

x <- list()
x$test <- 1
assign("x$test", 2)
ls()
[1] "x"      "x$test"

Элемент "test" в "x" по-прежнему равен 1, и вы извлекаете его с помощью x$test, но get("x$test") будет значением 2 от этого имени.

Почему бы просто не использовать имена напрямую? То есть

this.name <- "test"
x[[this.name]] <- 2

Ответ 4

Другое решение:

x <- list()
x$test <- 1
assign("x$test", 2)
x$test == 1
TRUE
eval(parse(text="x$test<-2"))
x$test == 1
FALSE

Команда eval(parse(text="")) может быть очень полезна в этом контексте.

С уважением