18

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

これが私が得ているエラーです:

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

他のいくつかのバージョンを試しましたが、すべて同じエラーが発生します。私は何を間違っていますか?

編集:コードがあまり実用的ではないことを認識しています。私の目標は、関数型プログラミングをよりよく理解することです。私はSASで同様のマクロを書きました.Rで対応するものを書こうとしていましたが、失敗しています. 例としてこれを選んだだけです。これは非常に単純な例だと思いますが、機能していません。

4

1 に答える 1

18

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

aandbの代わりに"a"andを渡してい"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)
于 2013-07-16T21:48:21.650 に答える