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()
导入函数不会创建新的命名空间,因此导入后更容易编辑。
我正在开发一个包,目前它有很多功能。为了在每次打开 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()
导入函数不会创建新的命名空间,因此导入后更容易编辑。