Почему не присваивается() значения элементу списка в R?
Я пытаюсь использовать значения назначения в объекте в списке. Я хочу изменить некоторые элементы. Например:
x <- list()
x$test <- 1
assign("x$test", 2)
x$test == 1
[1] TRUE
Любые мысли? Мне нужно использовать назначение, потому что я создаю функцию, которая будет принимать имена объектов в списке (x) в качестве входов.
Ответы
Ответ 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
Ответ 3
Вы пробовали < < -? Я использовал это, чтобы назначать имена и значения списку из функции в сообщении вчера (см. "Объединить ряд кадров данных и создать новые столбцы для данных в каждом" ).
Ответ 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=""))
может быть очень полезна в этом контексте.
С уважением