私はすでにこれとそれを見てきましたが、それでも私の問題を解決できないことに注意してください。
最小限の作業例を考えてみましょう:
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)
、許可される唯一の入力です。
アプローチ:最初にandを関数呼び出しの引数に置き換えてから、呼び出しを評価するためにpaste
andsubstitute
と組み合わせて使用しようとしました。ただし、ここでは引用符のエスケープが問題のようです。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")
ように、上記と同じエラーが再び発生します。