我想在我自己编写的包中使用%>%
包中引入的管道运算符magrittr
来链接dplyr
数据转换。 magrittr
在Import
文件中列为DESCRIPTION
。加载我自己的包并测试使用管道操作符的函数后,我收到以下错误消息:
functionname出错(参数,:找不到函数“%>%”
在函数源代码中将%>%
更改为magrittr::%>%
也无济于事,因为无法再构建包。
答案 0 :(得分:78)
如果magrittr
中列出了Depends
,它应该可以正常工作。但是,这是not advised。相反,您将magrittr
留在Imports
并将以下行添加到NAMESPACE
:
importFrom(magrittr,"%>%")
我建议阅读Writing R extensions。您的问题将在第1.1.3和1.5.1段中介绍。
答案 1 :(得分:27)
另一个解决方案 - 使用roxygen
包。它是作为devtools
包的一部分实现的。安装devtools
后,致电devtools::document()
会为您更新NAMESPACE
。它还使用文档自动构建.Rd文件,这很方便。
您所做的只是将#' @import packagename
格式的特殊注释添加到文件以导入该包中的所有函数,或#' @importFrom packagename functionname
以导入函数。您可以在文件中包含任意数量的这些注释,因此您可以在每个文件的顶部或每个需要外部函数的函数中添加一组注释。
然后运行devtools::document()
并解析代码以查找这些注释,然后为您创建适当的NAMESPACE
文件。容易。
答案 2 :(得分:13)
假设你正在使用RStudio,Hadley的devtools
包,并在magrittr
文件的Imports部分列出DESCRIPTION
,这里是我采取的步骤{{1}在我的包函数中工作。
首先,写函数%>%
:
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()
目录中创建this之类的文件,您的功能应该按预期工作。
答案 3 :(得分:12)
现在有一种更简单的方法来在您的包装中支撑管道。精彩的软件包usethis
具有功能use_pipe()
。您只需运行一次该函数即可处理所有内容。 use_pipe()
文档中是这样描述usethis
函数的:
是否需要进行设置才能在包装中内部使用magrittr的管道 并将其重新导出给您软件包的用户:
在“ DESCRIPTION”中的“导入”中添加magrittr
使用必要的制氧模板创建R / utils-pipe.R