Преобразовать строку в нестроковый ввод для функции
Как я могу сохранить строку (например, диапазон столбцов "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)