【发布时间】:2015-06-15 19:59:35
【问题描述】:
在 R 中是否可以将自定义函数分配给数学运算符(例如 *、+)或将 as.formula() 提供的公式解释为评估指令?
具体来说,我希望将* 解释为intersect(),并将+ 解释为c(),因此R 将评估表达式
(a * (b + c)) * d) 或 myfun(as.formula('~(a * (b + c)) * d)'), list(a, b, c, d))
作为
intersect(intersect(a, c(b, c)), d)
我可以使用gsub()ing 在while() 循环中以字符串形式提供的表达式产生相同的结果,但我想这远非完美。
编辑:我错误地发布了sum() 而不是c(),所以一些答案可能是指问题的未编辑版本。
示例:
############################
## Define functions
var <- '[a-z\\\\{\\},]+'
varM <- paste0('(', var, ')')
varPM <- paste0('\\(', varM, '\\)')
## Strip parentheses
gsubP <- function(x) gsub(varPM, '\\1', x)
## * -> intersect{}
gsubI <- function(x) {
x <- gsubP(x)
x <- gsub(paste0(varM, '\\*', varM), 'intersect\\{\\1,\\2\\}', x)
return(x)
}
## + -> c{}
gsubC <- function(x) {
x <- gsubP(x)
x <- gsub(paste0(varM, '\\+', varM), 'c\\{\\1,\\2\\}', x)
return(x)
}
############################
## Set variables and formula
a <- 1:10
b <- 5:15
c <- seq(1, 20, 2)
d <- 1:5
string <- '(a * (b + c)) * d'
############################
## Substitute formula
string <- gsub(' ', '', string)
while (!identical(gsubI(string), string) || !identical(gsubC(string), string)) {
while (!identical(gsubI(string), string)) {
string <- gsubI(string)
}
string <- gsubC(string)
}
string <- gsub('{', '(', string, fixed=TRUE)
string <- gsub('}', ')', string, fixed=TRUE)
## SHAME! SHAME! SHAME! ding-ding
eval(parse(text=string))
【问题讨论】:
-
如果您向reproducible example 提供示例输入数据和所需输出以测试可能的解决方案,这将有所帮助。看起来很奇怪,因为
sum(b,c)应该只产生一个值。 -
感谢您的建议,我刚刚附上了一个示例。我在写
sum()时想到了c()- 也已经注意到了 - 抱歉。
标签: r function variable-assignment formula evaluation