首页 > 解决方案 > 在函数体中使用 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)

谁能帮我找出我做错了什么,或者我是否应该使用不同的方法?

非常感谢,

标签: rfunction

解决方案


这行得通。

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连接valuesx_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

推荐阅读