我认为如果不写一个薄包装就可以做到这一点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)
如果它们变得太长(默认为 60 个字符),deparse 将尝试中断已解析的行。当它这样做时,它会返回一个字符串向量。plot 方法假定 '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"))