gpt4 book ai didi

r - 如何使用生成它的 R 调用自动为绘图命名?

转载 作者:行者123 更新时间:2023-12-04 10:26:18 24 4
gpt4 key购买 nike

R 的绘图非常适合数据探索,因为它通常具有非常智能的默认值。例如,当使用公式绘图时,绘图轴的标签来自公式。换句话说,以下两个调用产生相同的输出:

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

有没有办法获得类似的“智能自动标题”?

例如,我想打电话
plot(x~y, main=<something>)

并产生与调用相同的输出
plot(x~y, main="plot(x~y)")
<something>插入使用某种内省(introspection)的调用。

通过某种标准机制或外部包在 R 中是否有这样做的工具?

编辑:一个建议是将公式指定为字符串,并将其作为参数提供给 formula()调用以及 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))")

最佳答案

我认为如果不在 plot() 周围编写一个薄包装器,就无法做到这一点。 .原因是 R 在调用函数的评估框架中评估“提供的参数”,其中无法访问当前的函数调用 (see here for details)。

相比之下,“默认参数”是在函数的评估框架中评估的,从那里可以进行自省(introspection)。以下是几种可能性(只是您希望“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"))

关于r - 如何使用生成它的 R 调用自动为绘图命名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com