【问题标题】:Use string input of parent function as parameters for another使用父函数的字符串输入作为另一个函数的参数
【发布时间】:2020-10-14 11:13:11
【问题描述】:

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

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


    【解决方案1】:

    您可以在完全不传递字符向量的情况下执行此操作 - 只需使用裸变量作为输入。你可以使用类似下面的函数:

    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 package (v0.3.0) 于 2020 年 10 月 14 日创建

    【讨论】:

    • 感谢您的回答。我想添加/询问一些事情:-要获得相同的答案,您需要使用deriv(form, char_vars[-length(char_vars)], f),因此它不会在派生中使用变量x。 - 很抱歉使问题复杂化,因为我试图简化问题,但是否有可能在父函数中有更多参数而不会崩溃?即a0a1... (a0_value...) 的实际值,以便在函数内部对其进行评估:grad &lt;- attr(f1(a0 = a0_value, a1 = a1_value, a2 = a2_value, x = 3), "gradient")
    猜你喜欢
    • 2018-11-13
    • 2011-04-11
    • 1970-01-01
    • 2020-03-19
    • 2022-01-11
    • 1970-01-01
    • 2011-06-24
    • 2017-04-17
    相关资源
    最近更新 更多