r - 替换函数工厂 r 中的形式参数

标签 r metaprogramming

我正在尝试创建一个函数工厂来创建具有自定义形式参数名称的函数。这个想法是向工厂提供一个字符串,工厂反过来在形式和返回的函数体中替换它。我已经设法使用 eval(parse(text=paste())) 来做到这一点,但我在其他地方读到了这种不好的做法。如何在避免执行 evalparse 的同时获得相同的输出?

MyLinearRateFunctions<-function(varX){

  eval(parse(text=paste("function(a,b,",
                    varX,
                    ") 1/(a + b*",
                    varX,
                    ")",sep="")
  ))

 }

(LinearRateMPG<-MyLinearRateFunctions('mpg'))

# function(a,b,mpg) 1/(a + b*mpg)
# <environment: 0x11c2f2a00>

(LinearRateCYL<-MyLinearRateFunctions('cyl'))

# function(a,b,cyl) 1/(a + b*cyl)
# <environment: 0x11e4cb908>

(LinearRateDISP<-MyLinearRateFunctions('disp'))

# function(a,b,disp) 1/(a + b*disp)
# <environment: 0x11e47eae8>

最佳答案

可能有一种更简洁的方法可以到达那里,但这里有一个想法:

fn <- function(x) {
    f <- eval(bquote(function(a, b) 1 / (a + b * .(as.name(x)))))
    formals(f) <- c(formals(f), setNames(alist(dummy = ), x))
    f
}

fn()的第一行,我们使用bquote()x代入数学表达式中。我们需要对其进行评估(使用eval()),将其从调用转换为函数。然后在第二行中,我们将第三个参数添加到形式参数列表中。最后一行返回该函数。

fn("mpg")
# function (a, b, mpg) 
# 1/(a + b * mpg)
# <environment: 0x4f05c78>

fn("cyl")
# function (a, b, cyl) 
# 1/(a + b * cyl)
# <environment: 0x4f9ba28>

快速检查:

fn("mpg")(1, 2, 3)
# [1] 0.1428571
1 / (1 + 2 * 3)
# [1] 0.1428571

感谢您要求提供更好的替代方案来替代 eval(parse(text = ...)),这绝对是不好的做法。

关于r - 替换函数工厂 r 中的形式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43107213/

相关文章:

javascript - 使用 OpenCPU 下载用于生成绘图的数据

julia - 在 Julia 中迭代具有不同数量参数的不同函数

C++ 模板类型特征问题

f# - 混淆元编程中的 F# 引用和模式匹配

c++ - 是否可以保证包含数组的类的大小?

r - 在 Shiny 的 react 值中使用分配?

r - 为什么我的 R 在运行诸如 step() 之类的函数时使用所有 CPU 内核?

r - 如何使用 y 作为 ggplot2 中每个 bin 的 x 值的总和绘制直方图

r - 如何在ggplot2中制作具有锐利过渡的色标

c++ - (C++) 编译时自动生成switch语句case