首页 > 解决方案 > R 无法识别我在另一个函数中的函数更新

问题描述

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

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

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

例如,如果我有:

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

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

任何人都知道是什么问题,我该如何解决?

标签: rpackagedevtools

解决方案


devtoolsload_all函数模拟加载包。包中的所有函数都存储在包命名空间中。函数通过它们的environment().

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

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

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

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

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


推荐阅读