在存在NAMESPACE的情况下,另一个问题是你试图从包foo运行一个未导出的函数。
例如(人为,我知道,但是):>modplot.prcomp(mod)Error:couldnotfindfunction"plot.prcomp"
首先,你不应该直接调用S3方法,但假设plot.prcomp在包foo中实际上是一些有用的内部函数。如果您知道自己在做什么,要调用此类函数需要使用:::。您还需要知道找到该函数的命名空间。使用getAnywhere()我们发现该函数在包统计中:>getAnywhere(plot.prcomp)Asingleobjectmatching‘plot.prcomp’wasfound
Itwasfoundinthefollowingplaces
registeredS3methodforplotfromnamespacestats
namespace:stats
withvaluefunction(x,main=deparse(substitute(x)),...)screeplot.default(x,main=main,...)
所以我们现在可以直接调用它:>stats:::plot.prcomp(mod)
我plot.prcomp只是用一个例子来说明目的。在正常使用中,您不应该像这样调用S3方法。但正如我所说,如果您要调用的函数存在(例如它可能是隐藏的实用程序函数),但是在a中namespace,R将报告它无法找到该函数,除非您告诉它要查找哪个命名空间。
将此与以下内容进行比较:stats::plot.prcomp上述操作失败,因为在stats使用时plot.prcomp,它不会导出,stats因为错误正确地告诉我们:错误:'plot.prcomp'不是'namespace:stats'中的导出对象
这记录如下:pkg :: name返回命名空间pkg中导出的变量名的值,而pkg ::: name返回内部变量名的值。