Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 当'function'是中缀运算符时,如何在包内使用'package::function()?_R_Magrittr_Infix Operator - Fatal编程技术网

R 当'function'是中缀运算符时,如何在包内使用'package::function()?

R 当'function'是中缀运算符时,如何在包内使用'package::function()?,r,magrittr,infix-operator,R,Magrittr,Infix Operator,根据H.Wickham的书R Packages,在包元数据一章中,关于如何添加包依赖项,Hadley指出了使用语法Package::function显式引用外部函数的好理由 在此处添加包依赖项可确保安装该包。但是,这并不意味着它将随您的软件包(即libraryx)一起提供。最佳实践是使用语法package::function显式引用外部函数。这使得识别哪些函数位于包之外变得非常容易。这在将来阅读代码时特别有用 从 但是,当函数是中缀运算符时,如何执行该操作?例如,我似乎无法执行1:10 magr

根据H.Wickham的书R Packages,在包元数据一章中,关于如何添加包依赖项,Hadley指出了使用语法Package::function显式引用外部函数的好理由

在此处添加包依赖项可确保安装该包。但是,这并不意味着它将随您的软件包(即libraryx)一起提供。最佳实践是使用语法package::function显式引用外部函数。这使得识别哪些函数位于包之外变得非常容易。这在将来阅读代码时特别有用


但是,当函数是中缀运算符时,如何执行该操作?例如,我似乎无法执行1:10 magrittr::%>%sqrt?在这里采用函数样式将违背使用管道操作符的目的。。。不是吗?

我想您只要使用从magrittr那里导入的内容就安全了。但是如果你想要的话,你可以通过这样做来确保你的符号是指你想要的符号

your_fun <- function(){
  `%>%` <- magrittr::`%>%`
  # now use %>% like you normally would
  # and you can be sure it refers to the magrittr version.
  return(42)
}
不能将package::infix与中缀语法一起使用,但可以将中缀运算符与标准语法一起使用。例如:

"+"(1, 2)
# [1] 3

Hmisc::"%nin%"(1:3, 2)
# [1]  TRUE FALSE  TRUE
不幸的是,当包未加载时,这对magrittr不起作用,可能是由于它的替换技巧

## what a shame that this beauty doesn't work:
magrittr::"%>%"(1:5, mean)
# Error in pipes[[i]] : subscript out of bounds

library(magrittr)
"%>%"(1:5, mean)
# [1] 3
在包上下文中,我建议只导入magrittr,或者至少导入%>%

您引用的资料足以解释此最佳实践背后的一些原因:

这使得识别哪些函数位于包之外变得非常容易。这在将来阅读代码时特别有用


这似乎不适用于这种情况。您不太可能忘记%>%来自何处,或者错误地认为它是在您的包中创建的

我知道这与当前的R风格运动背道而驰,但我想问你是否真的需要在你的包中使用管道语法。真正需要是一个有点过于强烈的声明:但它使代码更易于阅读…return42的目的是什么?嗯。。。你知道的。。。这是对生命、宇宙和一切终极问题的答案。如果让一个函数返回其他任何东西,那将是愚蠢的。除非你想让我还给你一张小猫的照片。这是可以理解的。