我正在尝试测试包中是否存在特定的变量或函数。例如,假设我想测试包“图形”中是否存在名为plot
的函数。
以下测试是否存在函数plot
,而不是它来自哪个包:
exists('plot', mode='function')
或者我可以测试plot
包中存在名为graphics
的内容,但这并不能告诉我它是否是一个函数:
'plot' %in% ls('package:graphics')
有没有一种很好的方式可以问“模式Z的包Y中是否存在名为X的对象”?(基本上,我可以将exists
限制在特定包中吗?)< / p>
(是的,我可以将以上两行合并到第plot
位于graphics
的第一次测试,然后询问plot
的模式,但如果我有自己的功能怎么办? plot
屏蔽graphics::plot
?我可以信任exists('plot', mode='function')
的输出吗?)
背景:为我的包编写测试,并希望测试导出的各种函数。我正在使用包testthat
,它在我可以看到包的所有内部函数的环境中执行测试,并且被exists('myfunction', mode='function')
蜇了,返回true,但我实际上忘记了导出{ {1}}。我想测试各种功能导出。
答案 0 :(得分:9)
哦,我找到了。
我注意到在?ls
中它表示第一个参数('package:graphics'
对我来说)也算作环境。 exists
'where
参数与ls
'name
参数具有相同的文档,因此我猜测'package:graphics'
也可能在那里工作:
exists('plot', where='package:graphics', mode='function')
[1] TRUE # huzzah!
答案 1 :(得分:7)
environment(plot)
<environment: namespace:graphics>
find('+')
#[1] "package:base"
find('plot')
#[1] "package:graphics"
find('plot', mode="function")
#[1] "package:graphics"