データセットを受け取り、その環境で読み取られたデータセットを使用してplot()関数を出力するR関数を記述しようとしています。これは、attach()を使用する必要がないことを意味します。これが私の例です:
mydata <- data.frame(a = rnorm(100), b = rnorm(100,0,.2))
plot(mydata$a, mydata$b) # works just fine
scatter_plot <- function(ds) { # function I'm trying to create
ifelse(exists(deparse(quote(ds))),
function(x,y) plot(ds$x, ds$y),
sprintf("The dataset %s does not exist.", ds))
}
scatter_plot(mydata)(a, b) # not working
ここに私が得ているエラーがあります:
Error in rep(yes, length.out = length(ans)) :
attempt to replicate an object of type 'closure'
他のいくつかのバージョンを試しましたが、すべて同じエラーが発生しました。何が悪いのですか?
編集:私はコードがあまりにも実用的ではないことを理解しています。私の目標は、関数型プログラミングをよりよく理解することです。 SASで同様のマクロを作成しましたが、対応するマクロをRで作成しようとしていましたが、失敗しました。私はこれを例として選んだだけです。これはかなり単純な例だと思いますが、まだ機能していません。
いくつかの小さな問題があります。 ifelse
はベクトル化された関数ですが、必要なのは単純なif
だけです。実際、else
は実際には必要ありません。データセットが存在しない場合は、ただちにエラーをスローすることができます。エラーメッセージはオブジェクトの名前を使用していないため、独自のエラーが発生することに注意してください。
_"a"
_と_"b"
_の代わりにa
とb
を渡しています。 _ds$x
_構文の代わりに、(fortunes::fortune(312)
)をプログラミングするときは_ds[[x]]
_構文を使用する必要があります。それが関数を呼び出す方法である場合は、それらの引数も解析する必要があります。最後に、deparse(substitute())
ではなくdeparse(quote())
が必要だと思います
_scatter_plot <- function(ds) {
ds.name <- deparse(substitute(ds))
if (!exists(ds.name))
stop(sprintf("The dataset %s does not exist.", ds.name))
function(x, y) {
x <- deparse(substitute(x))
y <- deparse(substitute(y))
plot(ds[[x]], ds[[y]])
}
}
scatter_plot(mydata)(a, b)
_