是否有等效于在 R 中将双冒号运算符 (::) 与 source() 一起使用?

Is there an equivalent to using the double colon operator (::) with source() in R?

由于我的项目包含许多不同的文件,这些文件只包含函数定义(然后我 source() 在主工作流文件中),我经常会忘记确切的函数包含在哪个文件中。

如果我可以使用我的源文件,如具有如下语法的包,这将不是问题:source("file.r")::function()。当然,该代码 returns 是一个错误 (Error: unexpected '::' in "source("file.r")::"),但我希望有一个等效的运算符可用于源文件。

您可以使用环境来实现这一点,使用 $ 代替 ::

如果您有文件:

  • file1.R

    func1 <- function(x) x + 1
    func2 <- function(y) y + 2
    
  • file2.R

    func3 <- function(x) x + 3
    func4 <- function(y) y + 4
    

然后您可以为它们创建环境并使用 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

注意:file2.R 中定义的函数将不会“看到”file1.R 中的函数。这有利有弊:

  • Pro: 名称空间污染减少。如果您在文件中定义了其中的函数必须能够引用的常量,那么这很有效。这些常量在某种意义上对同一文件中的函数是“私有的”(非常宽松地说)。

  • Con:与“包”不同,必须看到彼此的函数必须在同一个文件中定义,或者必须有另一种机制来确定在哪里找到其他函数。