我想在我自己编写的包中使用magrittr
包中引入的管道运算符%>%
来链接dplyr
数据转换。 magrittr
在DESCRIPTION
文件中列为Import
。加载我自己的包并测试使用管道运算符的函数后,我收到以下错误消息:
函数名称(参数, : 找不到函数 "%>%" 中的错误
在函数源代码中将%>%
更改为magrittr::%>%
也无济于事,因为无法再构建包。
如果您在 Depends
中列出了magrittr
,它应该可以正常工作。但是,不建议这样做。相反,您将magrittr
保留在Imports
中,并将以下行添加到NAMESPACE
:
importFrom(magrittr,"%>%")
我建议阅读编写 R 扩展。您的问题在第 1.1.3 和 1.5.1 段中介绍。
现在有一种更简单的方法来支持包中的管道。精彩的包装usethis
具有use_pipe()
的功能。您运行该函数一次,它就会处理所有内容。以下是usethis
文档中对use_pipe()
函数的描述:
是否需要在包内部使用马格里特管道进行设置 并为包的用户重新导出它:
将 magrittr 添加到"说明"中的"导入"中
创建 R/utils-pipe。R与必要的roxygen模板
一个额外的解决方案 - 使用 roxygen
包。它是作为devtools
包的一部分实现的。安装 devtools
后,呼叫devtools::document()
将为您更新NAMESPACE
。它还自动构建。带有文档的 rd 文件,这很方便。
您要做的就是在文件中添加#' @import packagename
格式的特殊注释以导入该包中的所有函数,或#' @importFrom packagename functionname
导入函数。您可以在文件中包含任意数量的这些注释,因此您可以在每个文件的顶部设置一组注释,或者与需要外部函数的每个函数一起使用。
然后运行devtools::document()
,它会分析代码以查找这些注释,然后为您创建适当的NAMESPACE
文件。容易。
假设您使用的是 RStudio,Hadley 的devtools
包,并在DESCRIPTION
文件的"导入"部分中列出了magrittr
,以下是我为使%>%
在我的包函数中工作而采取的步骤。
首先,编写函数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()
}
第二,运行devtools::document()
。
第三,运行devtools::load_all()
。
将在您的 R/
目录中创建这样的文件,并且您的函数应该按预期工作。