r - 使用父函数的字符串输入作为另一个函数的参数
问题描述
我正在尝试创建一个返回给定公式的梯度函数的函数。一个最小的例子是(不将其封装在函数中):
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){} )")))
谢谢!
解决方案
您可以在根本不传递字符向量的情况下执行此操作 - 只需使用裸变量作为输入。您可以使用类似以下功能的东西:
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 日创建
推荐阅读
- c++ - 为什么有时可以在头文件中使用未前向声明或包含的类型?
- python - 如何阅读随机森林的拟合结果?sklearn
- java - 插入排序java
- kubernetes - 使用 Prometheus 从其他 Kubernetes 集群监控 Kubernetes 集群
- azure-virtual-machine - Terraform 在“根”模块中报告“未声明名为“模块名称”的模块
- parallel-processing - 从 python 调用 Fortran 的 MPI
- r - 将 Jags 模型转换为 stan 模型
- python - 值是列表的Python系列,获取另一个系列的索引列表对应于每个项目列表
- excel - 编写一个返回客户身体类型的函数
- node.js - 如何从 VSCode 的内置 Node.js 运行 js 文件?