Передать строку в качестве аргумента для функции вставки

Я пытаюсь передать имена строковых переменных функции вставки, чтобы вставить все строки вместе. Вот мве:

#bind strings to variable names
a <- c("abc", "def", "ghi")
b <- c("jkl", "mno", "pqr")
c <- c("stu", "vwx", "yz1")

paste(eval(letters[1:3]))
# "a" "b" "c"

Однако я хочу, чтобы содержимое трех переменных вставлялось в одну строку.

"abc def ghi jkl mno pqr stu vwx yz1"

Я знаю о квазицитатах, поэтому я попытался

get(letters[1:3])

Но это только дает мне

"abc def ghi"

Я знаю, что эта тема безумно подробно освещена в Интернете, но я безуспешно перепробовал все rlang глаголы.


person Tea Tree    schedule 31.08.2020    source источник
comment
Если вам нужно получить несколько значений, используйте mget(), а не get(), последнее возвращает только первое. Они будут возвращены в виде списка. Так что, возможно, paste(unlist(mget(letters[1:3])), collapse = " ") — это то, что вам нужно. Однако ничего из этого не является rlang. На языке R это может выглядеть примерно так: rlang::eval_tidy(rlang::expr(paste(c(!!!rlang::syms(letters[1:3])), collapse=" ")))   -  person MrFlick    schedule 31.08.2020
comment
О, это просто и на самом деле решает мою проблему. Спасибо! Есть ли решение, которое возвращает вектор символов напрямую (чтобы избежать удаления из списка)?   -  person Tea Tree    schedule 31.08.2020
comment
В базе R нет ничего, что расширится до нескольких аргументов, если вы не выполните маршрут do.call(). Но здесь вам нужно как-то совместить все ваши ценности. Я не уверен, что вы имели в виду, поскольку то, как вы написали бы это, paste(a,b,c) не возвращает желаемое значение. вам нужно paste(c(a,b,c), collapse=" "), что можно сделать с помощью paste(do.call("c", c(mget(letters[1:3]))), collapse=" "). Но вам нужно что-то, чтобы объединить эти векторы, будь то c() или unlist().   -  person MrFlick    schedule 31.08.2020
comment
Решение paste(unlist(mget является самым элегантным. Если вы опубликуете это, я приму это.   -  person Tea Tree    schedule 31.08.2020


Ответы (2)


Ответ, предложенный @MrFlick, прост и понятен. Вот способ использования get для отдельных символов.

paste0(sapply(letters[1:3], get, envir = .GlobalEnv), collapse = " ")
#[1] "abc def ghi jkl mno pqr stu vwx yz1"
person Ronak Shah    schedule 31.08.2020

Для полноты, чтобы применить квазицитирование, вам просто нужно преобразовать строки в символы:

s <- lapply( letters[1:3], as.name )
paste( do.call("c", s), collapse=" " )
# [1] "abc def ghi jkl mno pqr stu vwx yz1"
person Artem Sokolov    schedule 31.08.2020