1

ggplot2「同じように機能する」関数を作成したいと思いaes()ます。私の謙虚な試みは「オブジェクトが見つかりません」エラーで失敗します:

library(ggplot2)

data <- data.frame(a=1:5, b=1:5)

# Works
ggplot(data) + geom_point() + aes(x=a, y=b)

my.aes <- function(x, y) { aes(x=x, y=y) }
# Fails with "Error in eval(expr, envir, enclos) : object 'x' not found"
ggplot(data) + geom_point() + my.aes(x=a, y=b)

実装する正しい方法は何my.aes()ですか?これは、カプセル化とコードの再利用のためのものです。

おそらくこれは関連していますが、まだ方法がわかりません 。データフレーム内の式を評価するR関数を作成する方法

4

1 に答える 1

3

aes括弧や引数なしで入力して、それが何をしているのかを確認してください。

function (x, y, ...) 
{
    aes <- structure(as.list(match.call()[-1]), class = "uneval")
    rename_aes(aes)
}

引数を評価せずに引数の名前を取ります。基本的には後で名前を保存して、プロットしようとしているデータ フレームのコンテキストで名前を評価できるようにします (そのため、エラー メッセージが不平を言っていますeval)。したがってmy.aes(x=a, y=b)ggplot構築に含めると、 xin data--becausexは評価されませんでしたaes(x=x, y=y)

で何が起こっているかについての別の考え方は、次のaesようなものです。

my.aes <- function(x, y) {
  ans <- list(x = substitute(x), y = substitute(y))
  class(ans) <- "uneval"
  ans
}

plyr::.これは上記の例で機能するはずですが、 ( と同じmatch.call()[-1]パラダイムを使用する)の注を参照してくださいaes

同様のトリックは代替で実行できますが、関数を複数の方法で呼び出すことができる場合、値が正しいフレームから抽出されることを確認するのがますます難しくなります。代用のトリックは、それらを使用する関数に対してプログラムすることも困難にしますが、引用されたクラスは文字列を適切なデータ構造に変換する as.quoted.character を提供します。

my.aes自分自身を呼び出したい場合はaes、おそらく次のようになります。

my.aes <- function(x,y) {
    do.call(aes, as.list(match.call()[-1]))
} 

aes_stringRoman Luštrik が指摘した関数の例:

my.aes <- function(x,y) {
    aes_string(x = x, y = y)
}

my.aes("a", "b")ただし、この場合は呼び出しを変更する必要があります。

于 2013-01-16T08:35:36.000 に答える