【问题标题】:Is there an equivalent to using the double colon operator (::) with source() in R?是否有等效于在 R 中将双冒号运算符 (::) 与 source() 一起使用?
【发布时间】:2022-01-05 13:49:53
【问题描述】:

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

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

【问题讨论】:

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

标签: r function scope namespaces


【解决方案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.R 中定义的函数不会“看到”file1.R 中的函数。这有一些优点和缺点:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多