Использование вставки и замены в сочетании с кавычками в R

Обратите внимание, что я уже просмотрел это и то но все еще не могу решить мою проблему.

Предположим, минимальный рабочий пример:

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"), что снова приводит к той же ошибке, что и выше.


person iraserd    schedule 14.04.2014    source источник


Ответы (1)


Попробуй это:

foo <- function(x, y, data = data) {
    x <- deparse(substitute(x))
    y <- deparse(substitute(y))
    data[, c(x, y)]
}
person G. Grothendieck    schedule 14.04.2014
comment
Благодарю вас! Каждый день в R... открываются новые функции! Тем не менее, это может быть немного обескураживающим, когда вы получаете ответ на SO в течение нескольких минут на вопрос, который вы пытались решить самостоятельно в течение часа... :/ - person iraserd; 14.04.2014
comment
@rawr, ты пробовал этот вариант? - person A5C1D2H2I1M1N2O1R2T1; 14.04.2014