过载安培和;R中的运算符

过载安培和;R中的运算符,r,polymorphism,ampersand,R,Polymorphism,Ampersand,我喜欢用浆糊使我的安培运算符过载。这样我可以很容易地粘贴东西。像这样: R> "Hello" & " World" [1] "Hello World" 我实现这一目标的方式是: "&" <- function(...){paste(..., sep = "")} 等等。您需要在R中使用S3对象系统: `&` <- function(e1, e2) UseMethod("&", c(e1, e2)) `&.default` <-

我喜欢用浆糊使我的安培运算符过载。这样我可以很容易地粘贴东西。像这样:

R> "Hello" & " World"
 [1] "Hello World"
我实现这一目标的方式是:

"&" <- function(...){paste(..., sep = "")}

等等。

您需要在R中使用S3对象系统:

`&` <- function(e1, e2) UseMethod("&", c(e1, e2))
`&.default` <- function(e1, e2) paste(e1, e2)
`&.logical` <- function(e1, e2) .Primitive("&")(e1, e2)

我认为将
&.default
定义为使用
粘贴
是错误的:

`&` <- function(e1, e2) UseMethod("&", c(e1, e2))
`&.default` <- function(e1, e2) .Primitive("&")(e1, e2)
`&.character` <- function(e1, e2) paste(e1, e2)
"Hello" & "World"
[1] "Hello World"
 1*0
#[1] 0
 1&0
#[1] FALSE
 1&1
#[1] TRUE

`&`看一看。总之,您希望在R中使用一种类似对象的样式。
默认
行为是否符合逻辑,粘贴方法是否仅适用于
字符
?看起来安全多了。可能吧,但问题的提问方式让人觉得他们想使用
粘贴
,除非给出了
逻辑
。嗯,我认为为粘贴创建重载运算符是愚蠢的,因为您不能使用任何非常重要的参数,例如
sep
collapse
@CarlWitthoft,完全不同意。如果您必须进行任何繁重的字符串组装(例如,以编程方式创建HTML),那么拥有一个连接操作符是非常棒的(例如JS中的
+
,PHP中的
)。虽然在这种情况下,我会使用
paste0
作为函数。@BrodieG我并不反对编写一个“paste_all_this_crap”函数,而是要尽一切努力来重载“&”,并失去选择所需分隔符的选项,等等。@CarlWitthoft,但这不是操作符的重点吗?这是一个简单的选项,可以最大限度地减少键入,但显然是以失去对选项的访问权为代价的。必须在
paste0(“,x,”)
vs
”&x&
之间进行选择,我肯定更喜欢后者,即使这意味着我不能指定分隔符。(实际上,我希望能够执行
“$x”
,但这是另一天的项目)。我们可以设置
&.character
,以便第二个参数可以指定一个可选的连接器,用作“sep”值吗<代码>“x”&“-”和“Y”&“Z”
将返回
“x-Y-Z”
最后一句话相当神秘,但它让我想知道是否可以设计一个特殊构造的环境。
> 1 & 2
[1] "1 2"
> TRUE & FALSE
[1] FALSE
> "Hello" & "World"
[1] "Hello World"
> 
`&` <- function(e1, e2) UseMethod("&", c(e1, e2))
`&.default` <- function(e1, e2) .Primitive("&")(e1, e2)
`&.character` <- function(e1, e2) paste(e1, e2)
"Hello" & "World"
[1] "Hello World"
 1*0
#[1] 0
 1&0
#[1] FALSE
 1&1
#[1] TRUE