R:在自编写的包中使用magrittr管道运算符

ale*_*eth 88 namespaces r magrittr

我想在我自己编写%>%magrittr包中使用包中引入的管道运算符来链接dplyr数据转换.magrittrImportDESCRIPTION文件中.加载我自己的包并测试使用管道操作符的函数后,我收到以下错误消息:

functionname中的错误(参数,:找不到函数"%>%"

更改%>%magrittr::%>%函数源代码也无济于事,因为无法再构建包.

ton*_*nov 90

如果您已经magrittr列出,它应该可以正常工作Depends.但是,不建议这样做.取而代之的是,你离开magrittrImports和下面的行添加到NAMESPACE:

importFrom(magrittr,"%>%")
Run Code Online (Sandbox Code Playgroud)

我建议阅读写作R扩展.您的问题在第1.1.3和1.5.1段中有所涉及.

  • 如果你正在使用`roxygen2`,你可以添加`#'importFrom magrittr"%>%"`以在`roxygenize()`期间自动填充NAMESPACE. (47认同)
  • @RomanLuštrik,只是缺少@,应该是'#'@ importFrom magrittr"%>%"` (33认同)
  • 请注意,这只允许您在包内部使用'%>%`.如果你的API要求用户使用`%>%`链接函数,他们仍然必须显式加载`magrittr`.解决此问题的一种方法是重新导出该功能.这是[示例](https://github.com/rstudio/ggvis/blob/master/R/pipe.R)如何做到这一点. (11认同)
  • @alexanderketh 在这种情况下,您应该点击答案旁边的绿色勾号,将其标记为已接受。欢迎来到SO! (2认同)

Mik*_*ley 30

一个额外的解决方案 - 使用roxygen包.它是作为devtools包的一部分实现的.一旦devtools安装,呼叫devtools::document()将为您更新NAMESPACE.它还使用文档自动构建.Rd文件,这很方便.

您所要做的就是将格式的特殊注释添加#' @import packagename到文件中以从该包导入所有函数,或者#' @importFrom packagename functionname导入函数.您可以在文件中包含任意数量的这些注释,因此您可以在每个文件的顶部或每个需要外部函数的函数中放置一组注释.

然后运行devtools::document()并解析代码以查找这些注释,然后NAMESPACE为您创建适当的文件.简单.

  • 我通常会单独为每个函数添加导入注释.这样,如果文件中的其他功能发生变化,您的导入将保持准确.那么就没有全球定义了. (2认同)

And*_*ēza 18

现在有一种更简单的方法来支持包中的管道.精彩的包装usethis有这个功能use_pipe().你运行该功能一次,它处理一切.这是文档中use_pipe()描述函数的方式usethis:

是否需要在包内部使用magrittr的管道并为包的用户重新导出它:

将magrittr添加到DESCRIPTION中的"Imports"

使用必要的roxygen模板创建R/utils-pipe.R


Jub*_*les 15

假设你正在使用RStudio,Hadley的devtools软件包,并magrittrDESCRIPTION文件的Imports部分列出,这里是我%>%在我的软件包函数中使用的步骤.

一,写函数foo.R:

#' Convert \code{data.frame} to \code{list}.
#' 
#' @importFrom magrittr %>%
#' @name %>%
#' @rdname pipe
#' @export
#' @param x A \code{data.frame} object.
#' @examples
#' my_result <- foo(iris)
#'
foo <- function(x) {
    x %>%
        as.list()
}
Run Code Online (Sandbox Code Playgroud)

第二,跑devtools::document().

第三,跑devtools::load_all().

类似的文件会在你创建R/的目录,并按照预期的功能应该工作.

  • 这里`@name%>%`的目的是什么? (4认同)