如何定义灵活的';函数表达式';在R

如何定义灵活的';函数表达式';在R,r,function,expression,R,Function,Expression,是否可以编写灵活的函数表达式? 我想使用输入参数来控制函数的表达式 比如说 input arg -> function c(1,1) -> func1 = function(x) x+1 c(1,3,2) -> func2 = function(x) x^2+3*x+2 c(6,8,-1) -> func3 = function(x) 6*x^2+8*x-1 您可以使用polynom library(polynom) as.polynomial(c(2,3,1)) 2

是否可以编写灵活的函数表达式? 我想使用输入参数来控制函数的表达式

比如说

input arg -> function
c(1,1) -> func1 = function(x) x+1
c(1,3,2) -> func2 = function(x) x^2+3*x+2
c(6,8,-1) -> func3 = function(x) 6*x^2+8*x-1

您可以使用
polynom

library(polynom)
as.polynomial(c(2,3,1))
2 + 3*x + x^2 
as.polynomial(c(6,8,1)
1 + 8*x + 6*x^2 
编辑您当然可以使用
泛型
as.function.polymonent
将结果强制为函数。在这里,您可以更好地使用,
as.polylist`在给定系数列表的情况下创建许多多项式。例如:

lapply(as.polylist(list(c(2,3,1),c(6,8,1),c(6,8,-1))),
       as.function)

[[1]]
function (x) 
{
    w <- 0
    w <- 1 + x * w
    w <- 3 + x * w
    w <- 2 + x * w
    w
}
<environment: 0x00000000113bd778>

[[2]]
function (x) 
{
    w <- 0
    w <- 1 + x * w
    w <- 8 + x * w
    w <- 6 + x * w
    w
}
<environment: 0x0000000011524168>

[[3]]
function (x) 
{
    w <- 0
    w <- -1 + x * w
    w <- 8 + x * w
    w <- 6 + x * w
    w
}
<environment: 0x0000000011527f28>
lappy(如多段列表(c(2,3,1),c(6,8,1),c(6,8,-1)),
as(功能)
[[1]]
功能(x)
{

w
makepoly不清楚您希望从OP中获得多大的通用性。对于多项式的特殊情况,您可以:

f = function(x, coeffs) {
  sum(outer(x, seq_along(coeffs) - 1, `^`) * coeffs)
}

f(2, c(1,2,3)) # 1 + 2*x + 3*x^2, with x = 2
#[1] 17

我将此理解为制作函数的愿望,我认为agstudy/eddi响应可能会做到这一点,但我认为从头开始尝试可能会有所启发:

 poly.maker <- function(coefs) { func <- function(x){} #empty func in x
             body(func) <- parse(text= paste( seq_along(coefs),"*x^",   
                                  (length(coefs)-1):0,collapse="+" ) ) 
             return(func) }
 func2 <- poly.maker(c(1,2,3))  # return a function
 func2(3)  # now test it out
#[1] 18

poly.maker以下是我对这项任务的看法

create_poly <- function(coef)
paste(rev(coef),
      paste("x", seq_along(coef) - 1, sep = "^"),
      sep = "*", collapse = " + ")


make_polyfun <- function(input) {
    myfun <- paste("function(x)", create_poly(input))
    eval(parse(text = myfun))
}
create_polyOne liner:

polymaker2 <- function(coefs)
{
    eval(parse(text=paste0( "function(x) sum(x^(",length(coefs)-1,":0) * ",capture.output(dput(coefs)),")" )))
}

polymaker2我认为您的最后一个示例应该是6x^2+8x+1。您可能应该提到
as。函数可以用来将其转换为function@eddi谢谢。我编辑我的答案是为了将我的结果强制为一个函数。+1;这实际上是对这个问题的响应,因为您注意到hte系数的阶数是最高的到最低,我没有。@DWin谢谢,但这个级别其实没什么大不了的,只是一个惯例。顺便说一句,
body
Thank u dickoa!这就是我想要的。对不起,我的问题在一开始不清楚。我需要的是一个灵活的“函数表达式”,我可以在其他地方进一步使用,而不是函数。看起来很巴洛克。@DWin a据《韦氏大词典》报道:"巴洛克风格的:1.属于、关于或具有一种艺术表现风格的,尤其是在17世纪盛行的,通常以复杂的形式、大胆的装饰和对比元素的并置为特征的,通常传达戏剧、运动和紧张感的;2.以怪诞、夸张为特征的我喜欢第一个意思:-)特别值得注意的是:
..,capture.output(dput(coefs))
@DWin,你会怎么说呢?我试过这个:bquote((coefs))。返回一个数字向量,但它无法传递正确的字符串进行解析。
create_poly <- function(coef)
paste(rev(coef),
      paste("x", seq_along(coef) - 1, sep = "^"),
      sep = "*", collapse = " + ")


make_polyfun <- function(input) {
    myfun <- paste("function(x)", create_poly(input))
    eval(parse(text = myfun))
}
make_polyfun(c(1, 1))
## function(x) 1*x^0 + 1*x^1
## <environment: 0x243a540>

make_polyfun(c(1, 3, 2))
## function(x) 2*x^0 + 3*x^1 + 1*x^2
## <environment: 0x1bd46e0>

make_polyfun(c(6, 8, 1))
## function(x) 1*x^0 + 8*x^1 + 6*x^2
## <environment: 0x22a59c0>
polymaker2 <- function(coefs)
{
    eval(parse(text=paste0( "function(x) sum(x^(",length(coefs)-1,":0) * ",capture.output(dput(coefs)),")" )))
}
polymaker3 <- function(coefs)
{
    eval(parse(text=paste0( "function(x) colSums(t(outer(x, ",length(coefs)-1,":0, `^`))*",capture.output(dput(coefs)),")" )))
}