R:如何编写一个函数,用另一个函数调用替换一个函数调用?



例如,我想转换代码

mean(x)

fn(x)

每次我在代码中看到mean

replace_mean <- function(code) {
substitute(code, list(mean = fn)) # doesn't work
substitute(substitute(code), list(mean = fn)) # doesn't work
}

以上两种方法都行不通。 例如

replace_mean(list(mean(y), mean(x)))

在 R 中使用 NSE 进行函数替换的最佳方法是什么?

首选基本 R 解决方案。

更新示例输出

replace(mean(x)) # fn(x)
replace(list(a = mean(x), mean(ok))) # list(a=fn(x), fn(ok)))

以下函数,当传递mean(x)和一些fn(如sqrt(作为其两个参数时,返回调用对象fn(x),即sqrt(x),用fn替换mean的出现。

replace_mean <- function(code, fn) {
do.call("substitute", list(substitute(code), list(mean = substitute(fn))))
}

例子

1( 基本示例

e <- replace_mean(mean(x), sqrt)
e
## sqrt(x)
x <- 4
eval(e)
## [1] 2

2(更复杂的表达

ee <- replace_mean(mean(x) + mean(x*x), sqrt)
ee
## sqrt(x) + sqrt(x * x)
x <- 4
eval(ee)
## [1] 6

3(将replace_mean应用于F创建G的主体

f <- function(x) mean(x) + mean(x*x)
g <- f
body(g) <- do.call("replace_mean", list(body(f), quote(sqrt)))
g
## function (x) 
## sqrt(x) + sqrt(x * x)
x <- 4
g(x)
## [1] 6

一种方法要丑陋得多,它依赖于字符串操作来生成要运行的代码,然后对其进行评估。

replace_mean <- function(code) {
code_subbed = substitute(code)
# constructu the code I want
code_subbed_subbed = sprintf("substitute(%s, list(mean=quote(fn)))", deparse(code_subbed))
eval(parse(text = code_subbed_subbed))
}
replace_mean(list(mean(x), a=  mean(ok)))

最新更新