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


101

我想在我自己编写的一个程序包中使用%>%magrittr程序包中引入的管道运算符来链接dplyr数据转换。在文件中magrittr列出。加载我自己的包并测试使用管道运算符的功能后,我收到以下错误消息:ImportDESCRIPTION

函数名错误(参数,:找不到函数“%>%”

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


4
我建议不要在包中的函数内使用管道运算符。这使调试变得更加困难(调用堆栈在管道中变得异常疯狂)。对于软件包,我只覆盖一个临时变量,这使测试变得容易得多(请考虑:R告诉您错误发生在哪一行)。该管道适合交互使用,但对于编程来说可能是一个负担。

Answers:


101

如果您已在中magrittr列出,它应该可以正常工作Depends。但是,不建议这样做。相反,您留magrittr在其中Imports,并将以下行添加到NAMESPACE

importFrom(magrittr,"%>%")

我建议阅读Writing R扩展。您的问题在1.1.3和1.5.1段中讨论。


1
@alexanderketh在这种情况下,您应该点击答案旁边的绿色对勾标记以将其标记为已接受。欢迎来到SO!
tonytonov

54
如果您正在使用roxygen2,则可以添加#' importFrom magrittr "%>%"以在期间自动填充NAMESPACE roxygenize()
RomanLuštrik'15

38
@RomanLuštrik,只是想念@,应该是#' @importFrom magrittr "%>%"
Roah

13
请注意,这仅允许您%>%在包中内部使用。如果您的API要求用户链接使用的函数%>%,则仍然必须显式加载magrittr。解决此问题的一种方法是重新导出功能。这是一个如何做的例子
拉姆纳特(Ragnath)2015年

这也是usethis包做什么,提到这里
jiggunjer

33

现在,有一种更简单的方法可以在包装中支撑管道。精美的包装usethis具有功能use_pipe()。您只需运行一次该函数即可处理所有内容。这是use_pipe()usethis文档中描述功能的方式:

是否需要进行设置才能在包中内部使用magrittr的管道并为包用户重新导出:

将magrittr添加到DESCRIPTION中的“导入”

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


您是否将use_pipe()代码行添加到用于生成软件包的代码中?例如,我运行:usethis::use_description(usethis_description); usethis::use_build_ignore(directories); usethis::use_build_ignore(paste0(pkg_name, ".Rproj")); if (file.exists(file.path(pkg_path, "NAMESPACE"))) { file.remove(file.path(pkg_path, "NAMESPACE")) }; devtools::document(pkg_path); devtools::check(pkg_path); devtools::load_all(pkg_path); devtools::install(pkg_path)。我只是use_pipe()在开始添加吗?
乔什,

1
@Josh usethis在开发软件包时只使用一次功能。然后,这些功能将必要的部分添加到构建说明及其他所有内容中。
安德鲁·布雷扎(AndrewBrēza),

32

另一种解决方案-使用roxygen包装。它作为devtools软件包的一部分实现。一旦devtools被安装,调用devtools::document()将更新NAMESPACE为您服务。它还使用文档自动构建.Rd文件,非常方便。

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

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


1
当我这样做时,它弄乱了与R脚本中第一个功能的帮助文件有关的以下氧气注释。如何将全局氧气注释与帮助文件注释分开?
jzadra

2
我通常将导入注释与每个函数分开放置。这样,如果文件中的其他功能发生更改,导入将保持准确。因此,没有全局定义。
Mike Stanley

18

假设您使用的是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()
}

第二,运行devtools::document()

第三,运行devtools::load_all()

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


6
@name %>%这里的目的是什么?
JelenaČuklina
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.