web-dev-qa-db-ja.com

Rでは、次のエラーが発生します:「タイプが「クロージャー」のオブジェクトを複製しようとしています」

データセットを受け取り、その環境で読み取られたデータセットを使用して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で作成しようとしていましたが、失敗しました。私はこれを例として選んだだけです。これはかなり単純な例だと思いますが、まだ機能していません。

15
mahin

いくつかの小さな問題があります。 ifelseはベクトル化された関数ですが、必要なのは単純なifだけです。実際、elseは実際には必要ありません。データセットが存在しない場合は、ただちにエラーをスローすることができます。エラーメッセージはオブジェクトの名前を使用していないため、独自のエラーが発生することに注意してください。

_"a"_と_"b"_の代わりにabを渡しています。 _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)
_
15
GSee