【问题标题】:Functions Causing Objects to Disappear使物体消失的功能
【发布时间】:2012-08-02 19:29:04
【问题描述】:

这是我遇到的一个非常奇怪的情况。基本上,我试图将累积分布函数拟合到我的数据的 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 &lt;- 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 的局部变量,但它似乎也是函数中某些区域的局部变量。

任何帮助将不胜感激。

【问题讨论】:

  • 我无法复制。您确定第二个代码块中的代码与您在 R 中执行的代码完全相同吗?
  • 我确信它是。我在第二个块中更改的只是一个函数定义(它现在包含第一个块中的大部分代码),然后是对该函数的调用。
  • 有趣。我会很感激任何帮助,因为我正在尝试在 linux 服务器上以批处理模式运行一个大型程序,而这一小段代码让我很伤心。
  • 忽略上面的 cmets - 我发现只有当我已经在同一个空间中运行了以前的工作代码时它才不会抛出错误。
  • 贾斯汀的回答如下,输入mydata.Gest$r &lt;- new_r,有效。

标签: r function variables object spatstat


【解决方案1】:

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

具体来说,mydata.Gest$r &lt;- new_r 然后在绘图公式plot(..., cbind(rs, theo) ~ r, ...) 中将new_r 替换为r。这对我行得通。不知道为什么它在函数外部而不是内部起作用,但是依靠plotmydata.Gest 的本地范围之外查找new_r 是有风险的。

另外,使用= 将事物分配给数据框中的列,而不是&lt;-

从干净的会话中:

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

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

【讨论】:

  • 非常好的解决方案,贾斯汀,谢谢!然而,我仍然对我们没有确定错误发生的位置感到厌烦。我已经使用了我之前发布的过程,而且我从来没有遇到过任何问题。我以前的用途和我发布的用途之间的区别在于,其他用途都不涉及nls。我看到的唯一可能的错误是,在使用new_r 创建GvsR_dataframe 之后,new_r 对象可能在被nls 使用后被删除。我很好奇,想深入了解这个问题。
  • 我认为这与plot.Gest 的编写方式有关。在那个电话中,您遇到了问题。您可以在绘图调用的其他部分使用new_r,但公式部分似乎并没有超出数据参数的本地范围。
  • 我之前使用过plot.Gest,其中使用的自变量是绘图函数之外的对象,并且不隶属于mydata.Gest。这就是让我觉得它与nls有关的原因。
  • 您可以在函数中添加行,例如 print(head(new_r)),以帮助解决此问题。您还可以使用debugonce(ModelFit) 在其范围内单步执行函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 2016-10-04
相关资源
最近更新 更多