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



我想在我自己编写的包中使用magrittr包中引入的管道运算符%>%来链接dplyr数据转换。 magrittrDESCRIPTION文件中列为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/ 目录中创建这样的文件,并且您的函数应该按预期工作。

相关内容

  • 没有找到相关文章

最新更新