fra*_*ude 2 scope namespaces r function
由于我的项目包含许多不同的文件,这些文件只包含函数定义(然后source()在主工作流程文件中),我经常会忘记哪个函数包含在哪个文件中。
如果我可以使用我的源文件(例如具有如下语法的包),那么这不会成为问题:source("file.r")::function()。当然,该代码返回错误 ( Error: unexpected '::' in "source("file.r")::"),但我希望有一个可以用于源文件的等效运算符。
您可以使用环境来实现此目的,使用$代替::.
如果您有文件:
file1.R
func1 <- function(x) x + 1
func2 <- function(y) y + 2
Run Code Online (Sandbox Code Playgroud)
file2.R
func3 <- function(x) x + 3
func4 <- function(y) y + 4
Run Code Online (Sandbox Code Playgroud)
然后你可以为它们创建环境并将它们加载到那里local=:
e1 <- new.env()
source("file1.R", local = e1)
e2 <- new.env()
source("file2.R", local = e2)
ls()
# [1] "e1" "e2"
e1$func1(1)
# [1] 2
e1$func2(1)
# [1] 3
e2$func3(1)
# [1] 4
e2$func4(1)
# [1] 5
Run Code Online (Sandbox Code Playgroud)
注意: 中定义的函数file2.R不会“看到” 中的函数file1.R。这有一些优点和缺点:
优点:减少了命名空间污染。如果您在文件中定义了常量,其中的函数必须能够引用该常量,那么这很有效。从某种意义上说,这些常量对于同一文件中的函数来说是“私有的”(非常宽松地说)。
缺点:与“包”不同,必须相互看到的函数必须在同一文件中定义,或者必须有另一种机制来确定在哪里找到其他函数。