Динамически загружайте данные из пакета в R

#r #lazy-evaluation #evaluation

Вопрос:

Я хотел бы иметь возможность написать ниже в форме, которая использует интерполяцию строк.

 r[[glue("fic_{data}")]] lt;- switch(  data,  "data" = fic::data,  "targets" = fic::targets )  

Я пробовал такие вещи, как

 r[[glue("fic_{data}")]] lt;- eval(glue("fic::{data}")) r[[glue("fic_{data}")]] lt;- eval(sym(glue("fic::{data}"))) r[[glue("fic_{data}")]] lt;- eval(glue("fic::{!!data}"))  

во многих сочетаниях и размещениях sym и. !!

Можно ли это сделать и как, если да, то как?

Комментарии:

1. Можете ли вы использовать data(dataname, packagename)

Ответ №1:

С eval , нам parse также может понадобиться

 gt; eval(glue("collapse::wlddev")) collapse::wlddev  

возвращает только glue объект

 gt; str(eval(parse(text = glue("collapse::wlddev")))) 'data.frame': 13176 obs. of 13 variables:  $ country: chr "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...  ..- attr(*, "label")= chr "Country Name"  $ iso3c : Factor w/ 216 levels "ABW","AFG","AGO",..: 2 2 2 2 2 2 2 2 2 2 ...  ..- attr(*, "label")= chr "Country Code"  $ date : Date, format: "1961-01-01" "1962-01-01" "1963-01-01" "1964-01-01" ...  $ year : int 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 ... ...  

Или используйте parse_expr от rlang

 eval(rlang::parse_expr(glue("collapse::wlddev")))  

Другой вариант-передать строку в поле data для загрузки данных

 data(list = "wlddev", package = "collapse") head(wlddev)