以编程方式在R中的`::`调用中切换包

Duc*_*o A 8 r package

我希望能够在一个调用中bar::foo(),能够以编程方式切换包,bar以便相同的语法调用hello::foo().

一个例子:

  • 假设我有三个包parentPkg,childPkg1childPkg2.
  • parentPkg我有一个功能调用childPkg1::foo()
  • foo() 也是一个功能 childPkg2
  • 我希望能够parentPkg使用::运算符来调用,foo()但以编程方式切换包名称.就像是:

    dummy_pkg_name = ifelse(scenario=="child1", "childPkg1", "childPkg2")
    dummy_pkg_name::foo()
    
    Run Code Online (Sandbox Code Playgroud)

可能吗?我该如何实现?

一些背景

parentPkg是一个与Web应用程序交互的函数,接收一些请求和数据,并根据场景返回不同统计模型的结果.
每个场景都非常复杂,并非所有内容都可以概括parentPkg.出于这个原因, childPkg1childPkg2(实际上也有3和4)之类的子包与数据清洗和每个场景的各种替代交易,但回到同一类的值.
这个想法是parentPkg根据场景将包切换到相关的子节点并调用所有必需的函数,而不必为每个子节点编写相同的序列,但只是稍微不同的::调用.

Jul*_*ora 12

既然::可以看作是一个功能,它看起来像

`::`(dummy_pkg_name, foo)()
Run Code Online (Sandbox Code Playgroud)

是你想要的.或者,

getFromNamespace("foo", ns = dummy_pkg_name)()
Run Code Online (Sandbox Code Playgroud)

例如,

`::`(stats, t.test)
# function (x, ...) 
# UseMethod("t.test")
# <bytecode: 0x102fd4b00>
# <environment: namespace:stats>

getFromNamespace("t.test", ns = "stats")
# function (x, ...) 
# UseMethod("t.test")
# <bytecode: 0x102fd4b00>
# <environment: namespace:stats>
Run Code Online (Sandbox Code Playgroud)