gpt4 book ai didi

将包和函数作为另一个函数中的参数引用

转载 作者:行者123 更新时间:2023-12-04 18:55:23 25 4
gpt4 key购买 nike

我试图在 R 中的不同包中找到特定功能的方法。例如 methods(broom::tidy)将返回函数 tidy 的所有方法包裹内broom .对于我当前的问题,如果我可以拥有 methods 会更好在另一个函数中运行,如下所示:f1 <- function(x,y){
methods(x::y)
}

(我删除了与我的问题无关的代码的其他部分。)
但是,当我像这样运行函数时:

f1 <- function(x,y){ methods(x::y)}
f1(broom,tidy)

我收到错误

Error in loadNamespace(name) : there is no package called ‘x’



如果我尝试修改它以仅更改功能但保持包相同,我会收到类似的错误:
f2 <- function(y){  methods(broom::y)}
f2(tidy)

Error: 'y' is not an exported object from 'namespace:broom'



如何获取包和函数名称以在函数中正确评估?当前问题是否与何时 r 有关?试图评估/替换函数中的值?

最佳答案

两者::methods()函数使用非标准评估来工作。这意味着您需要更聪明地将值传递给函数才能使其工作。这是一种方法

f1 <- function(x,y){ 
do.call("methods", list(substitute(x::y)))
}
f1(broom,tidy)

这里我们使用 substitute()扩大和 xy我们传入命名空间查找的值。这解决了 ::你可以看到的部分
f2 <- function(x,y){ 
substitute(x::y)
}
f2(broom,tidy)
# broom::tidy

我们需要替代品,因为很可能有一个包裹 x带功能 y .因此,使用 :: 时不会扩展变量.请注意 ::只是 getExportedValue() 的包装器如果您需要使用字符值从命名空间中提取值。

但还有一个问题: methods()不评估它的参数,它使用原始表达式来查找方法。这意味着我们实际上并不需要 broom::tidy 的值,我们传递那个文字表达式。由于我们需要评估替代品以获得我们需要的表达式,因此我们需要使用 do.call() 构建调用。为了评估 substitute并将该表达式传递给 methods()

关于将包和函数作为另一个函数中的参数引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58452820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com