У меня есть датафрейм индексов вложенных списков, которые хранятся в виде строк. Чтобы привести упрощенный пример:
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=)) (сопровождение кода станет кошмаром), но признаю, что у меня может быть небольшой выбор.
Любые советы приветствуются.
Как вы пришли к этому? Откуда взялся df1? Если у вас есть код, хранящийся в виде строк, в какой-то момент вам придется его проанализировать. Если вы хотите разрешить любой произвольный синтаксис R, использование синтаксического анализатора R имеет смысл (но потенциально «опасно», поскольку может быть запущен произвольный код). Если вы просто получили связку ключей, разделенных знаками доллара, вы могли бы сделать более безопасную версию.
@Мистер Флик. Я согласен, хранить код в строках далеко не идеально. Проблема в том, что я работаю с пакетом, который извлекает во вложенные списки, и для контроля и редактирования вне R эти индексы должны храниться в файлах CSV. Я пересмотрю свои варианты для этого, но пока этот метод придется делать.





Рассмотрим 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"))
Вы в основном получаете то, что ожидаете от этого, но ошибка все еще возникает:
invalid (do_set) left-hand side to assignment
Давай проверим:
> 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] ""
Удивительно! Большое спасибо! Возможно, у вас есть ресурс, где я могу найти больше об этом? Мне любопытно, почему [[1]] извлекает объект вызова call.
@Svencken Это упоминается в ?expression. Вы можете увидеть более подробную информацию о выражении в нем.
Большое спасибо за это. Хотите узнать больше о том, как R работает под капотом
Можете ли вы более четко указать ожидаемые результаты или желаемый результат? Кроме того, соответствует ли количество иерархий/уровней?