使用函数接收矢量化输出

时间:2018-03-21 20:54:55

标签: r

我想用x和coef为x的多个值创建一个函数,这样输出就是一个向量,就像我在这里试过的那样:

directpoly<-function(x,coef) {
  for(n in length(coef)) {
    total<-sum(coef*x^(0:(n-1)))
  }
  total
}

当我输入x的一个值和系数值的任何向量时,这是有效的,但我想要更多。我想为系数输入一定数量的值,比如c(5,9,-2),并且该函数产生三个不同的值,一个用于x的每个输入,例如x <-2:4。那么在那种情况下我想要输出15,14,9。任何想法?我很新,所以感谢所有的帮助。

编辑:我拿出一个“&lt; - ”,我意外地放在那里。对不起,如果这是造成混淆的原因。我最终想要的是一个功能 P(x)= c1 + c2 * x + ... + cn * x ^ n-1

1 个答案:

答案 0 :(得分:2)

这有用吗?

directpoly <- function(x, coef) {
  seqcoef <- seq_along(coef) - 1
  sapply(x, function(z) sum(coef*z^seqcoef))
}

directpoly(2:4, c(5,9,-2))
# [1] 15 14  9

如果是这样,解决这个问题的诀窍是两步:

  1. 确定要对x的每个值(无向量)执行的操作。在这种情况下,它只是来自:

    sum(coef*x^(1:length(coef)-1))
    sum(coef*x^(0:(length(coef)-1)))
    sum(coef*x^(seq_along(coef)-1))
    

    因为我最终将其放入一些循环/应用配方中,所以我不需要每次重新计算序列,所以我将其分解:

    seqcoef <- seq_along(coef) - 1
    sum(coef*x^seqcoef)
    
  2. 现在您知道每个x `要做什么,现在可以映射或应用它:

    sapply(x, function(z) ...)
    

    其中...是我们上面确定的。对于清晰的编码,许多人认为硬定义这个函数的技术是好的,所以像:

    directpoly1 <- function(x, coef, seqcoef = seq_along(coef) - 1) {
      sum(coef*x^seqcoef)
    }
    directpoly <- function(x, coef) {
      seqcoef <- seq_along(coef) - 1
      sapply(x, directpoly1, coef, seqcoef)
    }
    

    (我对这个版本采取了更多自由,使用标量参数显式运行它,主要用于单元测试。这不是绝对必要的,所以这个答案顶部的函数应该足够了。)