Преобразовать строку в нестроковый ввод для функции

Как я могу сохранить строку (например, диапазон столбцов "cyl:drat, vs:gear") так что я могу использовать его в функции, где он не должен интерпретироваться как символьная строка?


Например, я хотел бы выполнить следующую команду:

subset(mtcars, select=c(disp:drat, vs:gear))   

Но назначьте контент для select к переменной x:

x <- as.name("cyl:drat, vs:gear")
subset(mtcars, select=x)
#Error in x[j] : invalid subscript type 'symbol'

library(rlang)
x <- quo(!! sym("cyl:drat, vs:gear"))
subset(mtcars, select=x)
#Error in x[j] : invalid subscript type 'language'

x <- parse_expr("cyl:drat, vs:gear")
subset(mtcars, select=x)
#Error in x[j] : invalid subscript type 'language'

Назначение x <-"cyl" работает, но x <-"cyl:drat" аналогично не получается.


Советы о том, в каком формате x должен был бы уже быть долгожданным началом.

1 ответ

Решение

Вы пропустили c() в вашем выражении, и вам также нужно eval ваши выражения внутри subset:

library(rlang)

x <- parse_expr("c(cyl:drat, vs:gear)")
subset(mtcars, select=eval(x))

parse_expr эквивалентно parse в базе R:

x2 = parse(text="c(cyl:drat, vs:gear)")
subset(mtcars, select=eval(x2))

Вы также можете использовать parse_expr или же parse_exprs рядом select от dplyr, где это было предназначено для использования:

library(dplyr)

select(mtcars, !! x)

или для соединения списка выражений:

y = parse_exprs("cyl:drat; vs:gear")
select(mtcars, !!! y)
Другие вопросы по тегам