Присвоить значение индексам вложенных списков, хранящихся в виде строк в R - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть фрейм данных индексов вложенного списка, которые хранятся в виде строк.Чтобы привести упрощенный пример:

df1 <- data.frame(x = c("lst$x$y$a", "lst$x$y$b"), stringsAsFactors = F)

Это координаты для следующего списка:

lst <- list(x=list(y=list(a="foo",b="bar",c="")))

Я хотел бы заменить значения или назначить новые значения этим элементам, используя индексы вdf1.

Одна попытка была

do.call(`<-`, list(eval(parse(text = df1[1,1])), "somethingelse"))

, но это не похоже на буксировку.Вместо этого он присваивает "something" foo.

Я не слишком доволен использованием eval(parse(text=)) (поддержание кода станет кошмаром), но признаю, что у меня может быть небольшой выбор.

Любые советы приветствуются.

1 Ответ

0 голосов
/ 14 февраля 2019

Давайте рассмотрим 3 ситуации:

Случай 1

do.call(`<-`, list("lst$x$y$a", "somethingelse"))

Это создаст новую переменную с именем lst$x$y$a в вашем рабочем пространстве, поэтому следующие две командыбудем называть разные объекты.(Первый - это объект, который вы храните в lst, а второй - новая переменная. Вы должны вызывать его с помощью обратных кавычек, потому что его имя будет сбивать с толку R.)

> lst$x$y$a   # [1] "foo"
> `lst$x$y$a` # [1] "somethingelse"

Случай 2

do.call(`<-`, list(parse(text = "lst$x$y$a"), "somethingelse"))

В основном вы получаете то, что ожидаете, но ошибка по-прежнему возникает:

недопустимая (do_set) левая сторона для назначения

Давайте проверим:

> parse(text = "lst$x$y$a")  # expression(lst$x$y$a)

Он принадлежит классу expression, и оператор <-, похоже, не принимает этот класс в левой части.


Дело 3

Это даст то, что вы хотите:

do.call(`<-`, list(parse(text = "lst$x$y$a")[[1]], "somethingelse"))

Если поместить [[1]] позади expression объекта,call объект будет извлечен и вступит в силу в операторе <-.

> lst

# $x
# $x$y
# $x$y$a
# [1] "somethingelse"
# 
# $x$y$b
# [1] "bar"
# 
# $x$y$c
# [1] ""
...