Динамическое изменение имен списков в R с использованием нестандартной оценки

Что я пытаюсь сделать, так это установить имя элемента списка динамически в R из предопределенной строки и с использованием нестандартной оценки.

См. Пример ниже:

library(rlang)
dynamic.listname <- "important.name"

# this works (as was also demonstrated in the answer to this related question: https://stackoverflow.com/questions/35034384/dynamically-creating-named-list-in-r ):
list.to.display <- list(1,2,3)
names(list.to.display) <- c("first.fixed.name", dynamic.list.name, "second.fixed.name")

# But I would like something like this to work 
list.to.display <- list(
"first.fixed.name"   = 1,
!!dynamic.listname  := 2,
"second.fixed.name"  = 3
)
# it gives the following error: 
# Error: `:=` can only be used within a quasiquoted argument

Я основал приведенный выше код на примере tidyverse, последнем абзаце с названием «Установка имен переменных» на этом веб-сайте: https://dplyr.tidyverse.org/articles/programming.html

Таким образом, «dynamic.listname» следует сначала оценить как строку, которая была сохранена внутри этой переменной. Затем эта строка должна быть реализована как одно из имен в списке. Кто-нибудь знает, как реализовать нестандартную оценку в этой ситуации? Base R мне тоже подходит. Причина, по которой я хотел бы использовать другие параметры, которые в настоящее время еще не работают, заключается в том, что список, который я хочу использовать, встроен в определенную функцию пакета и, таким образом, немного сложен для манипулирования извне. Кроме того, я стараюсь больше узнать о нестандартной оценке.


person Leon Samson    schedule 24.02.2020    source источник
comment
Просто сделай names(list.to.display) <- c("first.fixed.name", eval(dynamic.listname), "second.fixed.name").   -  person ulfelder    schedule 24.02.2020


Ответы (1)


В базе R вы можете использовать deparse(substitute(x)):

make_list <- function(named_var, value)
{
  result <- list(deparse(substitute(value)))
  names(result) <- deparse(substitute(named_var))
  result
}

make_list(hello, world)
#> $hello
#> [1] "world"

Создано 24 февраля 2020 г. пакетом REPEX (v0.3.0)

person Allan Cameron    schedule 24.02.2020