我正在尝试创建一个功能,用户可以选择他们想要使用的运算符,从而产生不同的输出。但我似乎无法让它发挥作用。我知道我们不能将运算符分配给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 = "-")
答案 0 :(得分:3)
您可以在功能上get()
动态调用运算符函数,例如:
> get('+')(5, 2)
[1] 7
get()
函数接受一个字符串作为输入,并返回对该字符串对应的函数的引用(如果存在)。
通常在左侧和右侧使用一个函数参数调用运算符(例如5 + 2
)。
+
运算符函数本身只需要两个参数作为输入:
> args('+')
function (e1, e2)
NULL
这就是为什么我们可以像上面那样调用它。
答案 1 :(得分:3)
查看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 = "*")
小心,&#34; - &#34;在这种情况下没有意义。
答案 2 :(得分:1)
您可以使用%
符号在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%` = `*`)