【问题标题】:R doesn't recognise my functions updates within another functionR 无法识别我在另一个函数中的函数更新
【发布时间】:2020-02-05 17:06:18
【问题描述】:

我正在开发一个包,目前它有很多功能。为了每次打开 RStudio 时都加载它们,我使用 devtools 中的这行代码:

library(devtools)
suppressMessages(load_all("~/Codes/package1/"))

它工作正常,但问题是每当我更改已在另一个函数中使用的函数时,R 无法识别更改。

例如,如果我有:

func1 <- function() {
   print("version1")
}
func2 <- function() {
   func1()
}

然后将func1改成print("Vesion2"),重新运行再运行func2,它仍然会为我打印version1。

有人知道问题出在哪里,我该如何解决?

【问题讨论】:

    标签: r package devtools


    【解决方案1】:

    devtools load_all 函数模拟加载包。包中的所有函数都存储在包命名空间中。函数通过environment() 记住它们来自哪个命名空间。

    您在控制台中运行的任何代码都在全局环境中运行。所以当你运行时

    func1 <- function() {print("version2")}
    

    您正在全局环境中创建一个名为 func1 的新函数,但包命名空间中的 func1 仍然存在。您已经创建了一个“阴影”函数来掩盖原始函数。

    当您必须运行仍在包命名空间中的func2 时,它会看到对名为func1 的函数的调用。当它去寻找这个函数时,由于 R 的词法范围规则,它首先在它自己的命名空间中寻找。它会找到原始的funct1,而不是您在全局环境中创建的那个,所以它会运行它。

    包通常不会在加载后交换或更改其功能。您将保存以保存源并调用load_all 将该文件夹重新加载为包含新更改的包。如果你不是真的想模拟一个包,使用source() 导入函数不会创建新的命名空间,因此在导入后更容易编辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 2018-08-29
      相关资源
      最近更新 更多