这是一个常见问题解答问题,因此请尽可能完整。答案是社区答案,因此如果您认为缺少某些内容,请随时进行编辑。
我正在使用 R 并尝试过some.function
,但收到以下错误消息:
Error: could not find function "some.function"
这个问题经常出现。当你在 R 中遇到这种类型的错误时,你如何解决它?
这是一个常见问题解答问题,因此请尽可能完整。答案是社区答案,因此如果您认为缺少某些内容,请随时进行编辑。
我正在使用 R 并尝试过some.function
,但收到以下错误消息:
Error: could not find function "some.function"
这个问题经常出现。当你在 R 中遇到这种类型的错误时,你如何解决它?
您应该检查几件事:
install.packages("thePackage")
(这只需要做一次)require(thePackage)
(并检查它的返回值)或library(thePackage)
(每次开始新的 R 会话时都应该这样做)如果您不确定该功能位于哪个包中,您可以做一些事情。
help.search("some.function")
或??some.function
获取一个信息框,该框可以告诉您它包含在哪个包中。find
也getAnywhere
可用于定位功能。findFn
使用。sos
RSiteSearch("some.function")
或使用rdocumentation或rseek搜索是查找函数的替代方法。有时您需要使用旧版本的 R,但运行为新版本创建的代码。新添加的函数(例如 R 3.4.0 中的 hasName)将不会被找到。如果您使用较旧的 R 版本并想使用较新的功能,您可以使用包backports使此类功能可用。您还可以在 backports 的git 存储库中找到需要反向移植的函数列表。请记住,早于 R3.0.0 的 R 版本与为 R3.0.0 和更高版本构建的包不兼容。
在存在 NAMESPACE 的情况下,另一个问题是您正在尝试从包foo运行未导出的函数。
例如(人为,我知道,但是):
> mod <- prcomp(USArrests, scale = TRUE)
> plot.prcomp(mod)
Error: could not find function "plot.prcomp"
首先,您不应该直接调用 S3 方法,但假设plot.prcomp
实际上是包foo中的一些有用的内部函数。如果您知道自己在做什么,要调用这样的函数需要使用:::
. 您还需要知道函数所在的命名空间。使用getAnywhere()
我们发现该函数在包stats中:
> getAnywhere(plot.prcomp)
A single object matching ‘plot.prcomp’ was found
It was found in the following places
registered S3 method for plot from namespace stats
namespace:stats
with value
function (x, main = deparse(substitute(x)), ...)
screeplot.default(x, main = main, ...)
<environment: namespace:stats>
所以我们现在可以直接调用它:
> 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 返回内部变量名的值。
当计算机在我的控制之下时,我通常可以解决这个问题,但在使用网格时它更令人讨厌。当网格不是同质的时,并不是所有的库都可以安装,我的经验经常是因为没有安装依赖项而没有安装包。为了解决这个问题,我检查了以下内容:
.libPaths()
是一个很好的检查。ldd
R 的结果,以确保共享库遇到这种情况很多,其中一些步骤变得相当常规。尽管#7 似乎是一个很好的起点,但它们是按照我使用它们的频率的大致顺序列出的。
如果在您检查包裹(R CMD 检查)时发生这种情况,请查看您的 NAMESPACE。
您可以通过将以下语句添加到 NAMESPACE 来解决此问题:
exportPattern("^[^\\\\.]")
这会导出不以点(“.”)开头的所有内容。这允许您拥有以点开头的隐藏功能:
.myHiddenFunction <- function(x) cat("my hidden function")
我有错误
错误:找不到函数
some.function
在对我使用 RStudio 制作的包进行 R CMD 检查时发生。我发现添加
出口模式(“。”)
到 NAMESPACE 文件就可以了。作为旁注,我最初将 RStudio 配置为使用 ROxygen 来制作文档——并选择了 ROxygen 为我编写我的 NAMESPACE 文件的配置,这会不断擦除我的编辑。因此,在我的实例中,我从 Roxygen 配置中取消选中 NAMESPACE 并将 exportPattern(".") 添加到 NAMESPACE 以解决此错误。
如果缺少一些强制参数(即您没有提供足够的参数),即使函数的名称有效,也会发生此错误。
我在 Rcpp 上下文中得到了这个,在那里我编写了一个带有可选参数的 C++ 函数,并且没有在 R 中提供这些参数。看来来自 C++ 的可选参数被 R 视为强制性的。结果,R 找不到正确名称但参数数量不正确的匹配函数。
Rcpp 功能:SEXP RcppFunction(arg1, arg2=0) {}
R 调用:
RcppFunction(0)
引发错误
RcppFunction(0, 0)
不
Rdocumentation.org有一个非常方便的搜索功能 - 除其他外 - 可让您从 CRAN 上的所有包以及来自 Bioconductor 和 GitHub 的包中查找函数。
如果您正在使用,则parallelMap
需要将自定义功能导出到从属作业,否则您会收到错误“找不到功能”。
如果您在同一参数上设置了非缺失级别,parallelStart
则应将其传递给parallelExport
,否则您会得到相同的错误。所以应该严格遵守:
parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
您可以通过名称间距 ::函数调用来修复此错误
comparison.cloud(colors = c("red", "green"), max.words = 100)
到
wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)
我得到了同样的错误,我运行的是 .99xxx 版本,我从帮助菜单中检查了更新并将我的 RStudio 更新为 1.0x,然后错误没有出现
如此简单的解决方案,只需更新您的 R Studio