我希望能够在一个调用中bar::foo(),能够以编程方式切换包,bar以便相同的语法调用hello::foo().
一个例子:
parentPkg,childPkg1和childPkg2.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.出于这个原因, childPkg1和childPkg2(实际上也有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)