我有一个我做的功能,它如下:
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)
行时,我没有收到此错误,并且它很好。
这是怎么回事?
答案 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
。)