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的答案似乎很好。@BenBolkerevalq(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")))