approx
和approxfun
的帮助包含以下警告:
警告
approxfun返回的值包含对代码中的代码的引用 R的当前版本:它不打算保存并加载到 不同的R会话。对于R> = 3.0.0,这更安全。
我不完全确定这意味着什么,尤其是最后一部分是“对R> = 3.0.0更安全”。我编写了一些包含用approxfun
创建的函数的代码。现在将该代码放入包中是否安全?我已经测试了它似乎有效,但我不知道我是否可以依赖它。
这适用于Windows 7 64位上的R 3.1.1。
确切的代码是这样的。我有一些关于函数值的数据,我想近似基础函数(我没有源代码)。
.table <- read.table(text="x y
10.0 150
37.8 147
65.6 145
93.3 142", header=TRUE) # plus several more lines in the original
# this function is to be exported in the package
f <- with(.table, approxfun(x, y))
.approxfun
这是stats包中未导出的函数。因此,未来版本的R可能会省略此功能,尽管这可能不太可能,至少在短期内如此。还有另一个问题。我仔细研究了approxfun
的来源,并以以下几行结束:
....
x <- as.double(x)
y <- as.double(y)
.Call(C_ApproxTest, x, y, method, f)
function(v) .approxfun(x, y, v, method, yleft, yright, f)
}
.approxfun
只是:
function (x, y, v, method, yleft, yright, f)
.Call(C_Approx, x, y, v, method, yleft, yright, f)
看起来approxfun
调用已编译的C代码来初始化一些数据,然后.approxfun
使用该数据。如果我在打包的代码中调用approxfun
,我仍然可以依赖于最初的C调用吗?
答案 0 :(得分:4)
如果您对save()
fun返回的函数使用load()
和approx
,则警告更多。如果您查看
f
# function (v)
# .approxfun(x, y, v, method, yleft, yright, f)
# <bytecode: 0x10a20d948>
# <environment: 0x10a20d0d8>
您可以看到它只是调用名为.approxfun
的较低级别(未导出)函数。此功能不一定意味着被称为目录,并且可能在将来的R版本中发生变化。传递给函数的值存储在函数的环境中。观察:
ls.str(envir=environment(f))
# f : num 0
# method : int 1
# x : num [1:4] 10 37.8 65.6 93.3
# y : num [1:4] 150 147 145 142
# yleft : logi NA
# yright : logi NA
我不确定旧版本的R是否存在存储机箱内容的问题。
但只要你打电话给approx()
并返回一个值,你应该没问题。该警告似乎是关于在R图像数据文件中保留结果函数。
答案 1 :(得分:1)
这是一个改编自example(approxfun)
的例子。
x <- 1:10
y <- rnorm(10)
f <- approxfun(x, y)
f
是一个在某些新点处近似x
- y
曲线的函数。
set.seed(19790801)
f(runif(10, 1, 10))
## [1] -0.75163251 -0.75549423 -0.08916802 -0.14773144 0.55004544 -1.04215783 -0.24202646 -0.24400353 -0.16274046 -0.66116177
为此,它需要在某处存储x
和y
的副本。您可以使用以下方式查看它们:
environment(f)$x
## [1] 1 2 3 4 5 6 7 8 9 10
environment(f)$y
## [1] -0.2841479 1.0499758 -0.2363440 0.0399924 -0.2607020 0.5553470 -1.5858871 -0.8552268 0.2645726 -1.1651585
如果您保存f
并将其加载到其他会话中,那么这是否有效?
saveRDS(f, "f.rds")
# Start a new R session now
f <- readRDS("f.rds")
在调用f
时,即使x
和y
定义不同,我们是否会在新会话中获得相同的答案?
x <- 99:90
y <- rlnorm(10)
set.seed(19790801)
f(runif(10, 1, 10))
## [1] -0.75163251 -0.75549423 -0.08916802 -0.14773144 0.55004544 -1.04215783 -0.24202646 -0.24400353 -0.16274046 -0.66116177
是的!所以它似乎是安全的,至少在这种情况下。
正如MrFlick所指出的那样,警告是f
调用stats:::.approxfun
而未导出的,因此可能会在将来的R版本中发生变化。
因此,您可以安全地使用相同版本的R在会话之间复制f
,但不能将其复制到潜在的未来R版本中的会话。也就是说,我正在将警告翻译为
请勿将
approxfun
的结果用作永久数据存储的形式。