r - 在函数体中使用 do.call() 不起作用
问题描述
目前我有以下工作代码:
my_func <- function(form, char_vars, values) {
ext_char_vars <- c(char_vars, "x")
arglist <- lapply(ext_char_vars, function(x) NULL)
f <- as.function(append(setNames(arglist, ext_char_vars), quote({})))
deriv(form, char_vars, f)
}
f1 <- my_func(y ~ a0 + a1*x + a2*x^2, c("a0", "a1", "a2"))
grad <- attr(f1(a0 = 1, a1 = 2, a2 = 1.5, x = 3), "gradient")
我想把它们放在一起并让它返回一个参数函数。我希望以下代码能够实现这一目标并给出相同的最终结果,但事实并非如此:
my_func <- function(form, char_vars, values) {
ext_char_vars <- c(char_vars, "x")
arglist <- lapply(ext_char_vars, function(x) NULL)
f <- as.function(append(setNames(arglist, ext_char_vars), quote({})))
f1 <- deriv(form, char_vars, f)
f2 <- function(x_val){
attr( do.call(f1, as.list(values, x_val)), "gradient")
}
return(f2)
}
f1 <- my_func(y ~ a0 + a1*x + a2*x^2, c("a0", "a1", "a2"), c(1, 2, 1.5))
f1(3)
谁能帮我找出我做错了什么,或者我是否应该使用不同的方法?
非常感谢,
解决方案
这行得通。
my_func <- function(form, char_vars, values) {
ext_char_vars <- c(char_vars, "x")
arglist <- lapply(ext_char_vars, function(x) NULL)
f <- as.function(append(setNames(arglist, ext_char_vars), quote({})))
f1 <- deriv(form, char_vars, f)
f2 <- function(x_val) {
attr(do.call(f1, as.list(c(values, x_val)), "gradient")
}
return(f2)
}
f1 <- my_func(y ~ a0 + a1*x + a2*x^2, c("a0", "a1", "a2"), values=c(1, 2, 1.5))
f1(3)
# a0 a1 a2
# [1,] 1 3 9
解释:
您想要列表形式的 args,因此您只需要将其c
连接values
并x_val
转换as.list
。withoutc
as.list
忽略第二个参数。
as.list(c(values, x_val))
# [[1]]
# [1] 1
#
# [[2]]
# [1] 2
#
# [[3]]
# [1] 1.5
#
# [[4]]
# [1] 3
想想当你计算两个对象的平均值时,它非常相似。
mean(10, 15)
# [1] 10
mean(c(10, 15))
# [1] 12.5
推荐阅读
- c++ - cin和scanf的区别
- php - 未根据条件在 php jquery 中选中复选框
- laravel - 每次我发布数据时,Laravel 验证器都会失败
- excel - 使用 TextRange.InsertAfter 方法将文本添加到 VBA 导出的文本文件
- r -
- image - 不允许从 wwwroot 文件夹加载 MVC 中的本地资源(图像)
- c# - IIS 将子域重定向到特定站点和端口
- github - 我无法安装守望者
- ios - 我如何使用这个 Fastfile?,run_tests 给我 zsh: command not found: run_tests
- c# - c#如何从另一个类中的通用扩展方法调用Action