R 无法识别我在另一个函数中的函数更新

R doesn't recognise my functions updates within another function

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

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

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

例如,如果我有:

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

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

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

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

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

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

您正在全局环境中创建一个名为 func1 的新函数,但包命名空间中的 func1 仍然存在。您已经创建了一个 "shadow" 函数来屏蔽原始函数。

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

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