将运算符分配给 R 变量

Sam*_*Sam 6 r function operators

我正在尝试创建一个函数,用户可以在其中选择他们想要使用的运算符,从而产生不同的输出。但我似乎无法让它发挥作用。我知道我们不能将运算符分配给 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 = "-") 
Run Code Online (Sandbox Code Playgroud)

Kei*_*itt 5

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

> get('+')(5, 2)
[1] 7
Run Code Online (Sandbox Code Playgroud)

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

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

+然而,操作符函数本身只需要两个参数作为输入:

> args('+')
function (e1, e2) 
NULL
Run Code Online (Sandbox Code Playgroud)

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


sho*_*aco 4

查看 do.call,它采用函数名称作为参数。和

operator <- "+"
do.call(operator, list(2,3)
Run Code Online (Sandbox Code Playgroud)

你会得到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 = "*") 
Run Code Online (Sandbox Code Playgroud)

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