【问题标题】:How to correctly `save` a function which uses variables from the global namespace?如何正确“保存”使用全局命名空间变量的函数?
【发布时间】:2019-10-20 09:18:53
【问题描述】:
  • 我有两台仪器 A、B,它们彼此“关闭”,存在一些系统误差。例如。 A 始终从 B 读取 +5。
  • 所以,我需要一个函数A_to_B,它将 A 的读数映射到 B,例如A = B + 5
  • 我在脚本中编写了这个函数,使用 A 对 B 的线性模型。
  • 但是,我在其他任何地方都使用这些工具,所以我在其他脚本中需要它。
  • 所以,我尝试save 函数。
AB.readings <- read.csv('AB.csv')
AvB.lm <- lm(A~B+I(B^2), data=AB.readings)
A_to_B <- function(a) {
    coeff <- AvB.lm$coefficients - c(a, 0, 0)
    roots <- Re(polyroot(coeff))
    return(roots[roots>=0])  # A, B readings > 0
}
save(AvB.lm, A_to_B, file='calibration.RData')

但是,当我尝试在其他脚本中加载和使用此功能时:

source('calibration.RData')
AB.readings <- read.csv('AB2.csv')
AB.readings$A <- A_to_B(AB.readings$A)

我得到错误:

Error in A_to_B(AB.readings$A) : object 'AvB.lm' not found
Execution halted

所以很明显我在范围界定方面做错了。


在 R 中执行此操作的正确方法是什么?

【问题讨论】:

  • 假设我不想每次都重新运行lm(另外,我每次都必须加载“训练”CSV 数据,当我在不同的工作目录中时这似乎很棘手)。没有别的办法吗?
  • @RAB 为什么 Rdata 用于数据,而不是函数? Rdata文件可以保存任何R对象,包括函数。
  • R中的@RAB,函数是一等对象

标签: r rdata


【解决方案1】:

您应该使用load 而不是source。来自文档:

save 将 R 对象的外部表示写入指定文件。以后可以使用函数loadattach(或data,在某些情况下)从文件中读回对象。

旁注:RAB 上面的注释(Rdata 是用于数据,而不是函数。)不正确,save 也会保存函数。回想一下everything in R is an object,包括函数。 save 编写 R 对象的外部表示,因此 save 也将编写函数的外部表示。

【讨论】:

  • 我的错误,这是将我的脚本复制为 MWE 的拼写错误。我确实使用了负载而不是源,但范围没有“翻译”正确,因为我所指的 lm 对象本身并没有绑定到该功能范围。
  • @ning 它不必绑定到函数的本地范围。如果一个函数在本地找不到对象,它会在下一个环境中查找。使用source 我可以复制您的问题。当我用load 替换它时,我不再收到错误消息。如果这不能为您解决问题,我建议您使用可重现的示例来编辑您的问题。
  • 我明白了,谢谢!我现在不在电脑旁,但我会尝试一下,并在有时间的时候更新您。
猜你喜欢
  • 2012-03-13
  • 2011-03-25
  • 2014-02-17
  • 2011-08-31
  • 2017-01-04
  • 1970-01-01
  • 2015-04-22
  • 2012-12-28
  • 2013-11-19
相关资源
最近更新 更多