r - R 无法识别我在另一个函数中的函数更新
问题描述
我正在开发一个包,目前它有很多功能。为了在每次打开 RStudio 时加载它们,我使用 devtools 中的这行代码:
library(devtools)
suppressMessages(load_all("~/Codes/package1/"))
它工作正常,但问题是每当我更改已在另一个函数中使用的函数时,R 无法识别这些更改。
例如,如果我有:
func1 <- function() {
print("version1")
}
func2 <- function() {
func1()
}
然后更改func1
为print("Vesion2")
,重新运行它,然后运行 func2,它仍然会为我打印 version1。
任何人都知道是什么问题,我该如何解决?
解决方案
devtoolsload_all
函数模拟加载包。包中的所有函数都存储在包命名空间中。函数通过它们的environment()
.
您在控制台中运行的任何代码都在全局环境中运行。所以当你跑
func1 <- function() {print("version2")}
您正在创建一个func1
在全局环境中调用的新函数,但func1
来自包命名空间的仍然存在。您已经创建了一个掩盖原始函数的“影子”函数。
当你运行func2
它仍然在包命名空间中时,它会看到一个对名为func1
. 当它去寻找这个函数时,由于 R 的词法范围规则,它首先在它自己的命名空间中寻找。它会找到原始的funct1
,而不是您在全局环境中创建的,因此它会运行它。
包通常不会在加载后交换或更改其功能。您将保存以保存源并调用load_all
以将该文件夹重新加载为包含新更改的包。如果您不是真的试图模拟一个包,那么导入函数source()
不会创建新的命名空间,因此在导入后更容易编辑。
推荐阅读
- javascript - 从函数内的 forEach 内的 if 语句返回
- php - 如果遇到空值,php 是否有办法停止调用链?
- azure-cosmosdb - 如何使用嵌套分隔符拆分为子文档?
- macos - VLC:如何创建正版 MP4(不是 M4V)文件?
- html - 图像在 Firefox 中看起来不太好,因为它在 chrome 中看起来
- pandas - 基于多条件 pandas 的 Groupby 聚合
- mysql - 使用 GROUP_CONCAT 时如何从另一个表中输出列
- android - android - 以编程方式设置键盘语言输入
- javascript - 如何访问数组内的嵌套对象来验证它?
- c# - OnAuthorizationAsync 中的 Cancellationtoken