在包中使用approxfun

时间:2014-10-28 05:25:30

标签: r package

approxapproxfun的帮助包含以下警告:

  

警告

     

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))


<小时/>
编辑:感谢@MrFlick指出结果函数调用.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调用吗?

2 个答案:

答案 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

为此,它需要在某处存储xy的副本。您可以使用以下方式查看它们:

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时,即使xy定义不同,我们是否会在新会话中获得相同的答案?

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的结果用作永久数据存储的形式。