R:为什么.call plot带有y值

R:为什么.call plot带有y值,r,plot,R,Plot,我在构建函数时使用了do.call。但我遇到了这样的问题: z<-sample(1:3, 100, T) y<-rnorm(100) plot.list <- c(list(x=z,y=y)) do.call(plot, plot.list) z发生这种情况是因为plot。如果xlab和ylab为NULL 使用 但是,使用do.call,创建列表,并将名为y的变量替换为其内容,因此这种方法使用整个变量呈现标签 foo <- function(y) deparse(sub

我在构建函数时使用了
do.call
。但我遇到了这样的问题:

z<-sample(1:3, 100, T)
y<-rnorm(100)
plot.list <- c(list(x=z,y=y))
do.call(plot, plot.list)

z发生这种情况是因为
plot。如果
xlab
ylab
NULL

使用

但是,使用
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>

要使用
do.call
,您需要将
z
y
作为名称传递,以便它们不会提前得到评估

do.call("plot", list(x=as.name("z"), y=as.name("y")))

但是如果按照@mnel的建议显式地设置
xlab
ylab
,代码肯定会更清晰。

因为
plot
使用
deparse(替换()
尝试从传递的
x
y
变量中检索标签;在这种情况下,它们已经被评估过了,所以你得到了垃圾。您可以明确设置标签,也可以尝试使用相应的
eval
咒语…谢谢,本!你能用我的例子给出一个eval()的例子吗?我不能很快弄明白,这就是为什么我只留下一条评论而没有回答@mnel的答案似乎很好。@BenBolker
evalq(plot(z,y))
可能是您正在搜索的
eval
方法。可能不是?因为它不能处理任意指定的列表作为输入。。。
do.call(plot, list(x=z,y=y, xlab = "x",ylab="y"))
do.call("plot", list(x=as.name("z"), y=as.name("y")))