从封闭环境访问数据的功能

Dat*_*kie 6 r

我正在使用分段包,并davies.test()在函数内调用时遇到问题.

考虑以下情况:

library(segmented)

data = data.frame(x = 1:21, y = c(10:1, 0:10))
fit = lm(y ~ x, data = data)
fit.seg = segmented(fit, seg.Z = ~ x)
davies.test(fit.seg, seg.Z = ~ x, alternative = "greater")
Run Code Online (Sandbox Code Playgroud)

这完美地起作用并且表明分段回归具有两个统计上不同的斜率.

现在,如果我把所有这些打包成这样的函数:

testit <- function() {
  data = data.frame(x = 1:21, y = c(10:1, 0:10))
  fit = lm(y ~ x, data)
  fit.seg = segmented(fit, seg.Z = ~ x)
  davies.test(fit.seg, seg.Z = ~ x, alternative = "greater")$p.value
}
testit()
Run Code Online (Sandbox Code Playgroud)

然后它工作正常......

但是如果我fit从全球环境中删除它就会失败.

> rm(fit)
> testit()
 Error in eval(expr, envir, enclos) : object 'fit' not found
Run Code Online (Sandbox Code Playgroud)

问题似乎davies.test在于尝试访问封装的数据的方式fit:它似乎没有fit在封闭范围(在本例中是testit函数)中查找,而是直接跳到全局范围.

我确信这个问题与R的范围规则有些微妙关系.如果我能找到一个快速解决方案,可以防止我使用这个边缘案例麻烦包装作者,那将是很好的.

谢谢,安德鲁.

G. *_*eck 5

尝试插入##下面标记的行。仍然存在一个差异,如testit运行修改时出现的警告所示,但输出 pvalue 相同,因此它可能足以满足您的需求。当然,这是包中的一个错误,最好是询问包的维护者他们是否会修复它。

library(segmented)
testit <- function() {
  data = data.frame(x = 1:21, y = c(10:1, 0:10))
  fit = lm(y ~ x, data)
  fit.seg = segmented(fit, seg.Z = ~ x)
  environment(davies.test) <- environment() ##
  davies.test(fit.seg, seg.Z = ~ x, alternative = "greater")$p.value
}
testit()
Run Code Online (Sandbox Code Playgroud)

给予:

[1] 0.01858149
Warning message:
In summary.lm(object) : essentially perfect fit: summary may be unreliable
Run Code Online (Sandbox Code Playgroud)