2012-08-02 49 views
4

这是我遇到的一个非常奇怪的情况。基本上,我试图将累积分布函数拟合到我的数据的G函数中。完成后,我想绘制模型和原始数据,并将其输出为PDF。我会让代码解释(简单的复制和粘贴):导致对象消失的函数

library(spatstat) 

data(swedishpines) 

mydata <- swedishpines 

mydata.Gest <- Gest(mydata) 

Gvalues <- mydata.Gest$rs 

count <- (which(Gvalues == 1))[1] 

new_r <- seq(1/count, length(Gvalues)/count, by = 1/count) 

GvsR_dataframe <- data.frame(G <- Gvalues, R <- new_r) 

themodel <- suppressWarnings(nls(G ~ pnorm(R, mean, sd), data = GvsR_dataframe, start = list(mean=0.4, sd=0.2), trace = FALSE)) 

pdf(file = "ModelPlot.pdf") 

plot(mydata.Gest, cbind(rs, theo) ~ new_r, lty = c(1, 2), col = c("black", "red"), xlim = c(0, max(new_r)), ylim = c(0,1), main = paste("Model-fitting for G Function \n Mean = ",as.numeric(coef(themodel)[1]),"\n Standard Deviation = ",as.numeric(coef(themodel)[2]), sep=''), ylab = "G(r)", xlab = "Distance Between Particles (r)", legend = NULL) 
lines(new_r, predict(themodel), lty = 2, col = "blue") 
legend("bottomright", c("CSR", "Swedish Pines", "Normal Probability \n Density Function"), lty = c(2, 4, 1, 2), col = c("red", "black", "blue"), bg = 'grey', border = 'black') 

graphics.off() 

上面的代码完美地工作。

现在是奇怪的部分。

当我封装mydata <- swedishpines作为函数之后的所有命令,并且导致mydata成为此函数的输入时,它不再起作用。以下代码应该执行代码的最后一部分,但它不。

library(spatstat) 

data(swedishpines) 

mydata <- swedishpines 

ModelFit <- function(mydata) { 

mydata.Gest <- Gest(mydata) 

Gvalues <- mydata.Gest$rs 

count <- (which(Gvalues == 1))[1] 

new_r <- seq(1/count, length(Gvalues)/count, by = 1/count) 

GvsR_dataframe <- data.frame(G <- Gvalues, R <- new_r) 

themodel <- suppressWarnings(nls(G ~ pnorm(R, mean, sd), data = GvsR_dataframe, start = list(mean=0.4, sd=0.2), trace = FALSE)) 

pdf(file = "ModelPlot.pdf") 

plot(mydata.Gest, cbind(rs, theo) ~ new_r, lty = c(1, 2), col = c("black", "red"), xlim = c(0, max(new_r)), ylim = c(0,1), main = paste("Model-fitting for G Function \n Mean = ",as.numeric(coef(themodel)[1]),"\n Standard Deviation = ",as.numeric(coef(themodel)[2]), sep=''), ylab = "G(r)", xlab = "Distance Between Particles (r)", legend = NULL) 
lines(new_r, predict(themodel), lty = 2, col = "blue") 
legend("bottomright", c("CSR", "Swedish Pines", "Normal Probability \n Density Function"), lty = c(2, 4, 1, 2), col = c("red", "black", "blue"), bg = 'grey', border = 'black') 

graphics.off() 

} 

ModelFit(mydata) 

出现以下错误:

Error in eval(expr, envir, enclos) : object 'new_r' not found 

我很困惑。我一直在研究这个问题很长一段时间,只是不能想出解决这个问题的办法。 PDF输出,但它是腐败的,不会打开。我不知道为什么new_r'消失',但这样做会导致所有绘图操作停止。显然,new_r是函数ModelFit的本地函数,但它几乎看起来好像在函数的某些区域也是本地的。

任何帮助将不胜感激。

+0

我无法重现。你确定你的第二个代码块中的代码与你在R中执行的代码完全相同吗? – 2012-08-02 19:34:00

+0

我相信这是。我在第二个模块中改变的是一个函数定义(现在包含第一个模块的大部分代码),随后调用该函数。 – MikeZ 2012-08-02 19:38:56

+0

有趣。我非常感谢任何帮助,因为我试图在Linux服务器上以批处理模式运行一个大型程序,而这一小段代码让我感到非常悲伤。 – MikeZ 2012-08-02 19:40:10

回答

6

你在那里做了很多隐含的东西......我会建议更明确地写东西。

具体而言,mydata.Gest$r <- new_r然后在您的绘图公式plot(..., cbind(rs, theo) ~ r, ...)中用r代替new_r。这对我行得通。不知道为什么它在一个函数之外,而不是在里面,但依靠plot来看看mydata.Gest的本地范围以外的new_r是有风险的。

此外,使用=分配的事情列一个数据帧,而不是<-

从一个干净的会话:

data.frame(x<-1:10, y<- 1:10) 
ls() 

data.frame(x=1:10, y=1:10) 
ls() 
+0

非常好的解决方案,贾斯汀,谢谢! 但是,我仍然因为我们没有针对发生错误的事实而拖延。我使用了之前发布的流程,而且我从来没有遇到任何问题。我以前的用法和我发布的用法之间的区别在于,其他用户都不涉及'nls'。我看到的唯一可能的错误是,在使用'new_r'创建'GvsR_dataframe'后,'new_r'对象被'nls'使用后可能会被删除。我很好奇,想深入了解这个问题。 – MikeZ 2012-08-03 13:18:14

+1

我认为它与'plot.Gest'的写法有很大关系。它在那个你遇到问题的呼叫中。你可以在剧情调用的其他部分使用'new_r',但公式部分看起来并不超出数据参数的局部范围。 – Justin 2012-08-03 13:55:06

+0

在使用独立变量作为绘图函数之外的对象的上下文中,我曾经使用过'plot.Gest',并且与mydata.Gest没有关系。这就是我认为它与'nls'有关的原因。 – MikeZ 2012-08-03 14:14:19

相关问题