Обратите внимание, что я уже просмотрел это и то но все еще не могу решить мою проблему.
Предположим, минимальный рабочий пример:
a <- c(1,2,3)
b <- c(2,3,4)
c <- c(4,5,6)
dftest <- data.frame(a,b,c)
foo <- function(x, y, data = data) {
data[, c("x","y")]
}
foo(a, b, data = dftest)
Здесь последняя строка, очевидно, возвращает Error: undefined columns selected
. Эта ошибка возвращается, потому что нужно выбрать столбцы x
и y
, которые не являются частью фрейма данных dftest
.
Вопрос: Как мне нужно сформулировать определение функции, чтобы получить желаемый результат, который
> dftest[, c("a","b")]
# a b
# 1 1 2
# 2 2 3
# 3 3 4
который я хочу получить, вызвав функцию foo
.
Имейте в виду, что для того, чтобы решение было полезным для моих целей, формат вызова функции foo
следует считать фиксированным, то есть изменения вносятся только в саму функцию, а не в вызов. т.е. foo(a, b, data = dftest)
— единственный допустимый ввод.
Подход: я пытался использовать paste
и substitute
в сочетании с eval
, чтобы сначала заменить x
и y
аргументами вызова функции, а затем оценить вызов. Однако экранирование кавычек здесь кажется проблемой:
foo <- function(x, y, data = data) {
substitute(data[, paste("c(\"",x,"\",\"",y,"\")", sep = "")])
}
foo(a, b, data = dftest)
eval(foo(a, b, data = dftest))
Здесь foo(a, b, data = dftest)
возвращает:
dftest[, paste("c(\"", a, "\",\"", b, "\")", sep = "")]
Однако при оценке с eval()
(сосредоточившись только на части paste
)
paste("c(\"", a, "\",\"", b, "\")", sep = "")
возвращает:
# "c(\"1\",\"2\")" "c(\"2\",\"3\")" "c(\"3\",\"4\")"
а не, как я надеюсь, c("a","b")
, что снова приводит к той же ошибке, что и выше.