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

问题描述 投票:75回答:4

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

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

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

r namespaces magrittr
4个回答
80
投票

如果您在magrittr中列出了Depends,它应该可以正常工作。但是,这是not advised。相反,你将magrittr留在Imports并将以下行添加到NAMESPACE

importFrom(magrittr,"%>%")

我建议阅读Writing R extensions。您的问题在第1.1.3和1.5.1段中有所涉及。


27
投票

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

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

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


13
投票

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

首先,写函数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这样的文件将在你的R/目录中创建,你的函数应该按预期工作。


13
投票

现在有一种更简单的方法来支持包中的管道。奇妙的包usethis具有use_pipe()功能。你运行该功能一次,它处理一切。这就是use_pipe()文档中描述的usethis函数:

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

将magrittr添加到DESCRIPTION中的“Imports”

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

© www.soinside.com 2019 - 2024. All rights reserved.