与调用函数有关的有趣R错误

时间:2013-11-23 17:41:06

标签: r plot

我有一个我做的功能,它如下:

plot_colorByDensity = function(x,y,
                               ylim=c(min(y),max(y)),
                               xlim=c(min(x),max(x)),
                               xlab="",ylab="",main="") {
    #print(xlim)
    x1 = x
    x2 = y
    df <- data.frame(x1,x2)
    x <- densCols(x1,x2, colramp=colorRampPalette(c("black", "white")))
    df$dens <- col2rgb(x)[1,] + 1L
    cols <-  colorRampPalette(c("#000099", "#00FEFF", "#45FE4F","#FCFF00", "#FF9400", "#FF3100"))(256)
    df$col <- cols[df$dens]
    plot(x2~x1, data=df[order(df$dens),], 
         ylim=ylim,xlim=xlim,pch=20,col=col,
         cex=2,xlab=xlab,ylab=ylab,
         main=main)
}

它产生一个图表,其中颜色代表点的密度。看一下这个输出,以及上面函数产生的错误,导致没有绘制绘图:

> x
 [1]  0.4855447 -0.7463454 -0.3623149  0.4508110 -0.6204866 -0.8302512  1.7498530
 [8]  0.9920785  0.5215649  1.0366535
> y
 [1]  0.4855447 -0.7463454 -0.3623149  0.4508110 -0.6204866 -0.8302512  1.7498530
 [8]  0.9920785  0.5215649  1.0366535
> plot_colorByDensity(x,y)
Error in plot.window(...) : invalid 'xlim' value

这是有趣的部分:当我在函数中取消注释print(xlim)行时,我没有收到此错误,并且它很好。

这是怎么回事?

1 个答案:

答案 0 :(得分:2)

当您调用函数R doesn't immediately evaluate the arguments时,在您的情况下,当您的函数开始评估时,xlim实际上不包含{{1中的最小值和最大值的向量因为尚未评估生成这些值的表达式。如果没有x的调用,则表达式不会被评估,直到您到达print。但到那时,plot已经采用了新的价值:

x

看到此问题的最佳方法是在分配x <- densCols(x1,x2, colramp=colorRampPalette(c("black", "white"))) 之后将您的号召转至print

x

你会看到这个:

x <- densCols(x1,x2, colramp=colorRampPalette(c("black", "white")))
print(xlim)

显然无效[1] "#000000" "#FFFFFF"

解决此问题的最简单方法就是为xlim选择一个新名称。 (你可以通过调用x强制在函数开头评估xlim。)