7

Rのプロットは、非常にインテリジェントなデフォルトを持っていることが多いため、データ探索に最適です。たとえば、数式を使用してプロットする場合、プロット軸のラベルは数式から取得されます。つまり、次の2つの呼び出しは同じ出力を生成します。

plot(x~y)
plot(x~y, xlab="x", ylab="y")

同様の「インテリジェントな自動タイトル」を取得する方法はありますか?

たとえば、私は電話したい

plot(x~y, main=<something>)

そして、呼び出しと同じ出力を生成します

plot(x~y, main="plot(x~y)")

<something>ある種の内省を使用して使用される呼び出しを挿入する場所。

標準的なメカニズムまたは外部パッケージのいずれかを介して、Rでこれを行うための機能はありますか?

formula()編集:1つの提案は、数式を文字列として指定し、それを呼び出しとの引数として指定することでしたmain。これは便利ですが、データのサブセットを使用するなど、プロットに影響を与える可能性のあるパラメーターを見逃します。詳しく説明します

x<-c(1,2,3)
y<-c(1,2,3)
z<-c(0,0,1)
d<-data.frame(x,y,z)
plot(x~y, subset(d, z==0), main=<something>)

と同じ効果を持つために

plot(x~y, subset(d, z==0), main="plot(x~y, subset(d, z==0))")
4

3 に答える 3

7

の周りに薄いラッパーを書かずにこれを行うことはできないと思いますplot()。その理由は、Rが呼び出し元の関数の評価フレームで「指定された引数」を評価するためです。このフレームでは、現在の関数呼び出しにアクセスする方法がありません(詳細については、ここを参照してください)。

対照的に、「デフォルトの引数」は、イントロスペクション可能な関数の評価フレームで評価されます。ここにいくつかの可能性があります(タイトルに「myPlot」または「plot」を表示するかどうかだけが異なります:

## Function that reports actual call to itself (i.e. 'myPlot()') in plot title.
myPlot <- function(x,...) {
    cl <- deparse(sys.call())
    plot(x, main=cl, ...)
}

## Function that 'lies' and says that plot() (rather than myPlot2()) called it.
myPlot2 <- function(x,...) {
    cl <- sys.call()
    cl[[1]] <- as.symbol("plot")
    cl <- deparse(cl)
    plot(x, main=cl, ...)
}

## Try them out
x <- 1:10
y <- 1:10
par(mfcol=c(1,2))
myPlot(x,y)
myPlot2(y~x)

より一般的な解決策は次のとおりです。

plotCaller <- function(plotCall, ...) {
    main <- deparse(substitute(plotCall))
    main <- paste(main, collapse="\n")
    eval(as.call(c(as.list(substitute(plotCall)), main=main, ...)))
}

## Try _it_ out

plotCaller(hist(rnorm(9999), breaks=100, col="red"))

library(lattice)
plotCaller(xyplot(rnorm(10)~1:10, pch=16))

## plotCaller will also pass through additional arguments, so they take effect
## without being displayed
plotCaller(xyplot(rnorm(10)~1:10), pch=16)

deparseは、長すぎる場合(デフォルトは60文字)、解凍された行を分割しようとします。これを行うと、文字列のベクトルを返します。プロットメソッドは、「main」が単一の文字列であると想定しているため、main <- paste(main, collapse='\n')この行は、deparseによって返されたすべての文字列を連結し、を使用してそれらを結合することによってこれを処理し\nます。

これが必要な場合の例を次に示します。

plotCaller(hist(rnorm(9999), breaks=100, col="red", xlab="a rather long label",
    ylab="yet another long label"))
于 2013-03-04T23:55:07.120 に答える
3

もちろんあります!ここに行く:

x = rnorm(100)
y = sin(x)

something = "y~x"

plot(formula(something),main=something)

ここに画像の説明を入力してください

于 2013-03-04T23:23:58.333 に答える
3

の機能について考えているかもしれませんmatch.call。ただし、これは関数内で呼び出された場合にのみ実際に機能し、引数として渡されません。match.call呼び出してから他のすべてを渡すラッパー関数を作成するplotか、substituteを使用して呼び出しをキャプチャし、評価する前に呼び出しで変更することができます。

x <- runif(25)
y <- rnorm(25, x, .1)

myplot <- function(...) {
    tmp <- match.call()
    plot(..., main=deparse(tmp))
}

myplot( y~x )
myplot( y~x, xlim=c(-.25,1.25) )

## or

myplot2 <- function(FUN) {
    tmp1 <- substitute(FUN)
    tmp2 <- deparse(tmp1)
    tmp3 <- as.list(tmp1)
    tmp4 <- as.call(c(tmp3, main=tmp2))
    eval(tmp4)
}

myplot2( plot(y~x) )
myplot2( plot(y~x, xlim=c(-.25,1.25) ) )
于 2013-03-05T00:08:30.703 に答える