10

我正在尝试测试包中是否存在特定变量或函数。例如,假设我想测试一个名为plot“graphics”的函数是否存在。

下面测试一个函数是否plot存在,而不是它来自哪个包:

exists('plot', mode='function')

或者我可以测试包中是否plot存在一些名为的东西graphics,但这并不能告诉我它是否是一个函数:

'plot' %in% ls('package:graphics')

有没有一种很好的方法来询问“模式 Z 的包 Y 中是否存在一个名为 X 的对象”?(本质上,我可以限制exists特定的包吗?)

(是的,我可以将以上两行结合起来,首先测试plotingraphics然后询问 的模式plot,但是如果我有自己的函数plot屏蔽graphics::plot怎么办?那么我可以相信 的输出exists('plot', mode='function')吗?)

背景:为我的一个包写测试,想测试各种功能是否导出。我正在使用包testthat,它在我可以看到包的所有内部功能的环境中执行测试,并且被exists('myfunction', mode='function')返回 true 所刺痛,但我实际上忘记了 export myfunction。我想测试是否导出了各种功能。

4

3 回答 3

13

哦,我找到了。

我注意到?ls它说第一个论点('package:graphics'对我来说)也算作环境。exists'参数与'where参数具有相同的文档,所以我猜也可能在那里工作:lsname'package:graphics'

exists('plot', where='package:graphics', mode='function')
[1] TRUE  # huzzah!
于 2013-03-05T01:50:18.193 回答
8
 environment(plot)
<environment: namespace:graphics>

find('+')
#[1] "package:base"

find('plot')
#[1] "package:graphics"

find('plot', mode="function")
#[1] "package:graphics"
于 2013-03-05T02:18:48.517 回答
0

之前提出的所有答案都是步行环境,而不是命名空间。因此,它们的行为将根据目标包是否加载library()以及加载顺序而有所不同。

这是一种方法utils::getFromNamespace()

function_exists <- function(package, funcname) {
    tryCatch({
        utils::getFromNamespace(funcname, package)
        TRUE
    }, error = function(...) { FALSE })
}
于 2021-09-21T12:05:33.880 回答