【问题标题】:undefined function / function not found未定义函数/未找到函数
【发布时间】:2016-07-20 23:47:43
【问题描述】:

我为 R 创建了一个包来学习如何开发这些东西,但我遇到了一个我无法解决的错误。我看到这个错误并不少见,但我找不到解决方案。

这是我的包的代码(很简单):

absconc<-function(x,a,b,...)
{
  a<-as.numeric(a)
  b<-as.numeric(b)

absconcCalc<- function(x,a,b,...)
{
    conc<- (x*a)+b
}
conc<-absconcCalc(x,a,b,...)

print.absconc<- function(x,a,b,...)
{
cat("Slope:")
cat(a,"\n")
cat("Intercept:")
cat(b,"\n")
cat("Concentration:")
cat(conc)
}
print.absconc(x,a,b)
}

我使用 package.skeleton 创建了包,它的工作原理非常棒,甚至使用 R CMD build absconc 构建包也有效。

问题是当我尝试使用它给我的包时Error: could not find function "absconc"。 我虽然这是来自 NAMESPACE 和导出的问题,所以我尝试使用 export(absconc) 导出函数。当我尝试构建时,我收到一条错误消息:

Error in namespaceExport(ns, exports) : 
undefined exports: absconc, absconcCalc, print.absconc

我现在摸不着头脑,想了解为什么我的函数无法识别。 我将不胜感激,因为这只是我的第一个包。

编辑:这是我的文件(有点乱,抱歉) https://github.com/Frisacher/absconc

【问题讨论】:

  • 你是否把你的函数放在一个以.R结尾的文件和你的包的R/目录中,例如R/absconc.R
  • 使用package.skeleton()devtool::create() 自动生成包会在R/ 目录中创建absconc.R。你说的是这个吗?
  • 为什么不使用你的包创建一个 github 存储库,以便其他人可以更轻松地重现你的问题?另请注意,上面代码 sn-p 中的大括号{} 意味着只定义了一个函数(absconc);你的源代码是这样的吗?
  • 给你!另外,从技术上讲(我认为)我只需要并使用一个功能absconc。我不认为其他的必须进口......

标签: r function package


【解决方案1】:

您不应手动编辑 NAMESPACE。在 R 文件的顶部插入行 #' @export 并在控制台中运行 devtools::document()。这将为您做必要的事情。

现在您可以执行devtools::load_all() 并运行您的函数。


更明确:

1) 在根目录下创建一个名为“R”的文件夹,并创建一个 R 脚本,其中包含您在 cmets 中建议的 Martin Morgan 函数。

2) 为您的 R 脚本添加 roxygen 注释以将其导出:

#' @export

absconc<-function(x,a,b,...)
{
  a<-as.numeric(a)
  b<-as.numeric(b)
  ...
}

3) 在控制台中执行 devtools::document()。

> devtools::document()
Updating absconc documentation
Loading absconc
Writing NAMESPACE

4) 使用 devtools::load_all() 加载您的包。

> devtools::load_all()
Loading absconc

5) 运行你的函数。

> absconc(1,2,3)
Slope:2 
Intercept:3 
Concentration:5

【讨论】:

  • 理想情况下,您可以阅读 Hadley Wickham 关于 R 包的精美书籍!这两个部分尤其相关:r-pkgs.had.co.nz/namespace.htmlr-pkgs.had.co.nz/man.html#man-functions
  • 我确实看过这些文档,但很难一次获得并应用所有内容:) 我也尝试使用您的方法,但生成的 NAMESPACE 是空白的(除了“生成的.. 。”)。我尝试运行其余部分,但仍未找到该功能。所以我猜这个函数实际上没有导出。
  • 查看我编辑的答案。如果您阅读了每个部分的“工作流程”,您应该很扎实!
  • 哈利路亚!这次成功了!似乎同时使用package.skeletondevtools 都不起作用...奇怪的是,当我查看从package.skeleton() 生成的.R 文件时,这就是它的样子:.Random.seed
猜你喜欢
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2014-10-01
  • 2014-06-19
相关资源
最近更新 更多