将运算符分配给 R 变量

Posted

技术标签:

【中文标题】将运算符分配给 R 变量【英文标题】:Assigning operators into an R variable 【发布时间】:2017-01-11 23:16:39 【问题描述】:

我正在尝试创建一个功能,用户可以在其中选择他们想要使用的运算符,从而产生不同的输出。但我似乎无法让它工作。我知道我们不能将运算符分配给 R 对象,然后根据 R 对象名称将其用作运算符。有没有办法我可以做到这一点?或者也许是编写函数的更好方法?

test <- function(items, operator = "+")
bank_alpha <- matrix(ncol=6)
colnames(bank_alpha) <- colnames(bank_alpha, do.NULL = FALSE, prefix = "Q")
colnames(bank_alpha)[6] <- "A"
alphabet <- LETTERS[seq(1:26)]

 for (i in 1:items) 
  item <- c(alphabet[i], alphabet[i operator 1], alphabet[i operator  2], alphabet[i operator  3], alphabet[i operator  4], alphabet[i operator 5])
  bank_alpha <- rbind(bank_alpha, item)
  bank_alpha <- na.omit(bank_alpha)

return(bank_alpha)


  test(items=4, operator = "-") 

【问题讨论】:

您想在test 中使用“operator”参数作为函数吗? IE。 operator = "+"; match.fun(operator)(1, 3)?有很多更高级别的 R 函数示例,它们接受函数作为输入(例如 Reducelapplyouter 等) 是的,我现在明白了。感谢您的快速回复! 【参考方案1】:

您可以在功能上使用get() 来动态调用运算符函数,例如:

> get('+')(5, 2)
[1] 7

get() 函数将一个字符串作为输入,并返回对该字符串对应的函数的引用(如果存在)。

通常使用左侧一个函数参数和一个右侧函数参数调用运算符(例如5 + 2)。

+ 运算符函数本身只是将两个参数作为输入:

> args('+')
function (e1, e2) 
NULL

这就是为什么我们可以像上面那样称呼它。

【讨论】:

这很容易知道。非常感谢!【参考方案2】:

查看 do.call,它以函数名作为参数。与

operator <- "+"
do.call(operator, list(2,3)

你会得到5作为结果。

在你的例子中:

test <- function(items, operator = "+")
  bank_alpha <- matrix(ncol=6)
  colnames(bank_alpha) <- colnames(bank_alpha, do.NULL = FALSE, prefix = "Q")
  colnames(bank_alpha)[6] <- "A"
  alphabet <- LETTERS[seq(1:26)]

  for (i in 1:items) 
    item <- c(alphabet[i], alphabet[do.call(operator, list(i,1))], alphabet[do.call(operator, list(i,2))], alphabet[do.call(operator, list(i,3))], alphabet[do.call(operator, list(i,4))], alphabet[do.call(operator, list(i,5))])
    bank_alpha <- rbind(bank_alpha, item)
    bank_alpha <- na.omit(bank_alpha)
  
  return(bank_alpha)


test(items=4, operator = "*") 

注意,“-”在这种情况下没有意义。

【讨论】:

是的,这正是我所需要的。关于“-”,您是对的。谢谢! 如果它解决了您的问题,请不要犹豫接受它作为答案:) 注意如果像这样使用“do.call”会有大量的函数查找,会导致很大的性能开销。我建议将函数传递给“测试”,如果这似乎会导致代码更具可读性,则可能使用中缀表示法(请参阅下面的答案)。【参考方案3】:

您可以使用 % 符号在 R 中定义自己的运算符,这将允许您在代码中使用中缀表示法。有关更多详细信息,请参阅related question。

test <- function(items, `%op%` = `+`)
    bank_alpha <- matrix(ncol=6)
    colnames(bank_alpha) <- colnames(bank_alpha, do.NULL = FALSE, prefix = "Q")
    colnames(bank_alpha)[6] <- "A"
    alphabet <- LETTERS[seq(1:26)]

    for (i in 1:items) 
       item <- c(alphabet[i], alphabet[i %op% 1], alphabet[i %op% 2], alphabet[i %op% 3], alphabet[i %op% 4], alphabet[i %op% 5])
       bank_alpha <- rbind(bank_alpha, item)
       bank_alpha <- na.omit(bank_alpha)
    
    return(bank_alpha)


test(items=4, `%op%` = `*`)

【讨论】:

我一直想创建一个使用 %function% 的函数。现在我能。这是一个很好的例子。非常感谢!

以上是关于将运算符分配给 R 变量的主要内容,如果未能解决你的问题,请参考以下文章

Liquid:如何将运算符的输出分配给变量?

R 中是不是有类似于 Python 的 % 的字符串格式化运算符?

if 语句在每个分支上返回不同的变量,如何仅使用一个 <- 运算符分配给该变量?

将从方法返回的引用分配给变量

linux运算符

shell编程之运算符