我在构建函数时使用do.call
。但我遇到了这样的问题:
z<-sample(1:3, 100, T)
y<-rnorm(100)
plot.list <- c(list(x=z,y=y))
do.call(plot, plot.list)
为什么情节包含了y
值?
谢谢!
答案 0 :(得分:1)
这是因为如果plot.default
和x
为y
xlab
会尝试为ylab
和NULL
创建合理的标签
使用
deparse(substitute(y))
然而,使用do.call
,列表已创建,并且称为y
的变量被其内容替换,因此此方法使用整个变量呈现标签
foo <- function(y) deparse(substitute(y))
> do.call(foo, list(y=y))
[1] "c(1.19006018249756, -0.50627079218304, -0.103312348822805, 0.395028889714542, "
[2] "1.25258077222837, 2.63766225444435, 0.260296813253391, 0.280839960496168, "
[3] "-1.47428483557887, -0.585934600873922, 0.879979238185618, -0.0871689899965067, "
..... <truncated>
明确设置xlab
和ylab
即可。
do.call(plot, list(x=z,y=y, xlab = "x",ylab="y"))
答案 1 :(得分:1)
要使用do.call
,您需要将z
和y
作为名称,以便不会提前进行评估。
do.call("plot", list(x=as.name("z"), y=as.name("y")))
但是,如果您将xlab
和ylab
明确设置为@mnel建议,那么代码肯定会更清楚。