首页 > 解决方案 > 使用父函数的字符串输入作为另一个函数的参数

问题描述

我正在尝试创建一个返回给定公式的梯度函数的函数。一个最小的例子是(不将其封装在函数中):

f1 <- deriv(y ~ a0 + a1*x + a2*x^2, c('a0', 'a1', 'a2'), function(a0, a1, a2, x){} )

grad <- attr(f1(a0 = 1, a1 = 2, a2 = 1.5, x = 3),"gradient")

我知道 f1 不依赖于 a、b 和 c,因为它是线性的,但它可能会这样做。

现在,我想创建一个函数,该函数采用公式和变量并返回f1,如示例中所示。一些大纲(不工作)将是:

gradient_function <- function(formula, variables){
    f1 <- deriv(formula, variables, function(variables, x){} )
    return(f1)
}

问题在于如何告诉 R 我第二次使用variables,它是从创建的函数的参数deriv

我已经搜索了一段时间,唯一可行的解​​决方案,当一个人想要使用命名参数评估函数时,感觉很不稳定并且会带来一些额外的烦恼eval(parse()),这也意味着使用单引号和双引号,整个表达式来得到一些东西像:

但我想知道是否有更好的方法我不知道,这并不意味着构建一个可怕的字符串。

formula <- y ~ a0 + a1*x + a2*x^2

vars <- paste0("a", 0:2)

vector <- "c('a0', 'a1', 'a2')"

eval(parse(text = paste0("f2 <- deriv(", formula, ",", variables, ", function(", paste(vars, collapse=","),", x){} )")))

谢谢!

标签: r

解决方案


您可以在根本不传递字符向量的情况下执行此操作 - 只需使用裸变量作为输入。您可以使用类似以下功能的东西:

my_func <- function(form, ...)
{
  vars <- as.list(match.call())[-(1:2)]
  char_vars <- sapply(vars, as.character)
  arglist <- lapply(char_vars, function(x) NULL)
  f <- as.function(append(setNames(arglist, char_vars), quote({})))
  deriv(form, char_vars, f)
}

这使您可以f1这样做:

f1 <- my_func(y ~ a0 + a1*x + a2*x^2, a0, a1, a2, x)

这给出了与原始结果相同的结果:

grad <- attr(f1(a0 = 1, a1 = 2, a2 = 1.5, x = 3), "gradient")

grad
#>      a0 a1 a2  x
#> [1,]  1  3  9 11

reprex 包(v0.3.0)于 2020 年 10 月 14 日创建


推荐阅读