使用父函数的字符串输入作为另一个函数的参数

时间:2020-10-14 11:13:11

标签: 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){} )")))

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以完全不传递字符向量来执行此操作-仅使用裸变量作为输入即可。您可以使用以下功能:

.tabs_indicators li{
  height:5px;
  display: inline-block;
  cursor:pointer;
  width:5px;
  border-radius:50%;
  background:green;
}
ul{
  list-style:none;
}

您可以这样制作<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div class="content_wrapper"> <div class="tabs_wrapper"> <ul class="tabs tab_border"> <li data-id="contentOne" class="active">tab 1 </li> <li data-id="contentTwo"> tab 2 </li> <li data-id="contentThree"> tab 3 </li> <li data-id="contentFour"> tab 4 </li> <li data-id="contentFive"> tab 5 </li> <li data-id="contentSix"> tab 6 </li> </ul> <div class="d_flex"> <div class="tabs_wrapper tabs_indicators"> <ul class="tabs list_unstyled d_flex"> <li data-id="contentOne" class="active"></li> <li data-id="contentTwo"></li> <li data-id="contentThree"></li> <li data-id="contentFour"></li> <li data-id="contentFive"></li> <li data-id="contentSix"></li> </ul> </div> <div class="tab_controller d_flex "> <span class="tab_btn previous mr-10">left arrow</span><br> <span class="tab_btn next">right arrow</span> </div> </div> </div> <div class="tab_content"> <div class="tab_content_item contentOne"> content 1 </div> <div class="tab_content_item contentTwo"> content 2 </div> <div class="tab_content_item contentThree"> content 3 </div> <div class="tab_content_item contentFour"> content 4 </div> <div class="tab_content_item contentFive"> content 5 </div> <div class="tab_content_item contentSix"> content 6 </div> </div> </div> </body> </html>

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

reprex package(v0.3.0)于2020-10-14创建

相关问题