1. ホーム
  2. r

[解決済み】Rで、以下のエラーが発生しました。"attempt to replicate an object of type 'closure'"."

2022-03-03 13:44:55

質問

データセットを受け取り、その環境に読み込まれたデータセットで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

以下は、私が受け取ったエラーです。

エラー in rep(yes, length.out = length(ans)) : タイプ 'closure' のオブジェクトを複製しようとしました。

他のバージョンもいくつか試しましたが、すべて同じエラーになります。 何が間違っているのでしょうか?

EDIT: あまり実用的でないコードであることは承知しています。 私の目標は、関数型プログラミングをもっと理解することです。 SASで似たようなマクロを書いたので、Rでその対になるものを書こうとしていたところですが、失敗しています。 例としてこれを選んだだけです。 かなり単純な例だと思うのに、うまくいかないんです。

どのように解決するのですか?

小さな問題がいくつかあります。 ifelse はベクトル化された関数ですが、必要なのは単純な if . 実際には、このように else -- データセットが存在しない場合は、ただちにエラーを投げるようにすればよいのです。 エラーメッセージはオブジェクトの名前を使用していないので、独自のエラーを作成することに注意してください。

を渡しています。 ab ではなく "a""b" . の代わりに ds$x 構文を使用する必要があります。 ds[[x]] の構文は、プログラミングをするときに ( fortunes::fortune(312) ). もし、そのような方法で関数を呼び出したいのであれば、それらの引数もデパイスする必要があります。 最後に、あなたが欲しいのは 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)