R 中的二元运算符 %&% 其中引号是可选的

Binary operator %&% in R where quotation marks are optional

这些是我的说明:

创建一个二元运算符 %&%,它将两个字符串连接成一个字符串,使用 space 作为分隔符。编写一个运算符函数,其中术语周围的引号是可选的。以下输出是引用 and/or 未引用的参数。

> Hello %&% World 

[1] “Hello World” 

> “Hello” %&% “World”

[1] “Hello World” 

我构建了一个函数,在用引号引起来时连接两个字符串,

"%&%" = function(x,y) {
  if(is.character(x) || is.character(y))
    return(paste(x , y, sep=" "))
}

但如果您输入 > Hello %&% World,该功能将不起作用。我怎样才能让它接受这个论点?

你也许可以这样做

"%&%" = function(x,y) {
  x = substitute(x)
  y = substitute(y)
  if (!is.character(x)) x <- deparse(x)
  if (!is.character(y)) y <- deparse(y)
  if(is.character(x) || is.character(y))
    return(paste(x , y, sep=" "))
}

适用于

Hello %&% World
# [1] "Hello World"
"Hello" %&% World
[1] "Hello World"

但这是一个非常脆弱的解决方案。请注意,传递给此函数的参数必须是正确的符号名称,否则 R 解析器无法处理命令。

这很简单,似乎可以解决问题。

"%&%" = function(x,y) {
  paste( as.character(substitute(x)) ,as.character(substitute(y)) )
    }
 Hello %&% World
#[1] "Hello World"
 'Hello' %&% 'World'
#[1] "Hello World"

as.character 将 return 来自表达式或字符值的字符值。与 MrFlick 给出的警告相同,对于解析器将解释为复合的任何参数,这将不会成功。

 Hello %&% World View
Error: unexpected symbol in "Hello %&% World View"

如果您想赋予它基本的矢量功能,您需要评估参数。下面是第二个参数的定义:

"%&%" = function(x,y) {
    paste( as.character(substitute(x)) , if( length(substitute(y)) == 1) {                                          
                                                as.character(substitute(y))} else{ 
                                                       eval(substitute(y))} )
                       }

Hello %&% c(123,234)
[1] "Hello 123" "Hello 234"

第一个版本 returned [1] "Hello c(123, 234)"