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
4

6 回答 6

2

您可以使用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 

编辑您当然可以使用the genericas.function.polynomial . better here you can use ,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>
于 2013-07-23T18:15:58.613 回答
2

这是我对这项任务的看法

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))
}

通过OP给出的示例,我们有:

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>
于 2013-07-23T19:01:44.273 回答
2
makepoly <- function(b)
{
    p <- rev(seq_along(b) - 1)
    function(x)
    {
        xp <- outer(x, p, '^')
        rowSums(xp * rep(b, each=length(x)))
    }
}

# x^2 + 2x + 3
f <- makepoly(1:3)
f(0:4)
[1]  3  6 11 18 27
于 2013-07-23T18:21:05.373 回答
1

我将其解读为制作函数的愿望,并且我认为 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

请注意,我需要交换订单以同意 OP 请求,我只是在得到与@dickoa 不同的结果后才注意到这一点。这似乎不那么笨重:

 poly.make2 <- function(coefs) { func <- function(x){} 
        body(func) <- bquote(sum(.(coefs)*x^.( (length(coefs)-1):0 ) ) )
        return(func) }
 func <- poly.make2(c(1,2,5))
 func
#function (x) 
#sum(c(1, 2, 5) * x^c(2L, 1L, 0L))
#<environment: 0x29023d508>
 func(3)
#[1] 20
于 2013-07-23T19:01:11.127 回答
1

目前尚不清楚您希望从 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
于 2013-07-23T18:21:09.983 回答
0

一个班轮:

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)),")" )))
}
于 2013-07-23T19:20:01.693 回答