Почему значения R не присваиваются элементу списка в R? - PullRequest
11 голосов
/ 05 марта 2012

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

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

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

Ответы [ 4 ]

14 голосов
/ 05 марта 2012

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

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

Обратите внимание, что назначениеприкрепленный список или фрейм данных изменяет прикрепленную копию, а не исходный объект: см. «attach» и «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 ??

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

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

9 голосов
/ 05 марта 2012

Посмотрите, что происходит, когда вы присваиваете "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
1 голос
/ 18 марта 2012

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

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="")) может быть очень полезна в этом контексте.

С уважением

1 голос
/ 05 марта 2012

Вы пробовали << -?Я использовал это для назначения имен и значений списку из функции во вчерашнем сообщении (см. <a href="/6286554/obedinite-ryad-freimov-dannyh-i-sozdaite-novye-stolbtsy-dlya-dannyh-v-kazhdom"> "Объединение серии фреймов данных и создание новых столбцов для данных в каждом" ).

...