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

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

提问人:frandude 提问时间:1/5/2022 更新时间:1/5/2022 访问量:347

问:

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

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

R 函数 作用域 命名空间

评论

1赞 Donald Seinen 1/5/2022
看看盒子包及其模块 - 对于大型项目来说,这是非常简洁的工作流程。
2赞 Seb 1/5/2022
这不是您问题的答案,但我强烈推荐个人 R 包。如果需要设置个人 R 包,可以尝试 {personalr}。mrcaseb.github.io/personalr(注意:我是该软件包的维护者)
0赞 G. Grothendieck 1/5/2022
一个缺点是,如果将函数重新排列到不同的文件中,则必须修改函数调用。无论如何,一些可能性是:(1)导入包是处理此问题的另一个包。(2)只需为自己或在Windows上制作一个表格,或者(3)在每个函数中放置一个注释,指示它在哪个文件中。然后只需列出函数的来源即可找到答案。如果移动函数,则需要修改源,但不需要修改调用。grep function *.Rfindstr function *.R

答:

6赞 r2evans 1/5/2022 #1

您可以使用环境来实现此目的,使用 代替 .$::

如果您有文件:

  • 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.Rfile1.R

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

  • 缺点:与“包”不同,必须相互查看的函数必须在同一文件中定义,或者必须具有另一种机制来确定在哪里可以找到其他函数。