我正在使用分段包,并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")
这完美地起作用并且表明分段回归具有两个统计上不同的斜率.
现在,如果我把所有这些打包成这样的函数:
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()
然后它工作正常......
但是如果我fit
从全球环境中删除它就会失败.
> rm(fit) > testit() Error in eval(expr, envir, enclos) : object 'fit' not found
问题似乎davies.test
在于尝试访问封装的数据的方式fit
:它似乎没有fit
在封闭范围(在本例中是testit
函数)中查找,而是直接跳到全局范围.
我确信这个问题与R的范围规则有些微妙关系.如果我能找到一个快速解决方案,可以防止我使用这个边缘案例麻烦包装作者,那将是很好的.
谢谢,安德鲁.