【问题标题】:return the values in a vector after passing in a function传入函数后返回向量中的值
【发布时间】:2019-11-06 20:31:00
【问题描述】:

基本上,我有

x<-rnorm(5)

我写了一个向量,它接受整数1 <= n <= 5,然后在一个向量中返回来自系列(1/n) * sum_{i=1}^n (1/x_i)的结果

所以

 n=1 -> 1   * 1/x_1
 n=2 -> (1/2) * ( 1/(x_1 + x_2) )
 n=3 -> (1/3) * ( 1/(x_1 + x_2 + x_3) )
 n=4 -> (1/4) * ( 1/(x_1 + x_2 + x_3 + x_4) )

我写了这个函数:

 series <-  function(n){
       n=seq(1,5,1)
       x<-rnorm(length(n))
       print(x)
  return  (  (1/n)* (1/sum(x[1:length(x[n])]))   )
}

但结果不正确,例如

 > series(5)
 [1]  1.17810059  0.85472777 -0.55077392 -0.03856963 -0.19404827
 [1] 0.8003608 0.4001804 0.2667869 0.2000902 0.1600722

对于n=2 -&gt; 1/2 * 1/x_1 + 1/x_2 = (1/2) * (1/(1.17810059+ 0.85472777)),但不幸的是,根据我的代码,结果是0.4001804

P.S:我想编写没有循环且没有任何函数需要调用库的代码!只需使用 R 中的基本已知函数定义一个简单的函数,然后我可以保存结果,如果需要使用 Vectorize()outer()

【问题讨论】:

    标签: r


    【解决方案1】:

    sum() 函数未矢量化。它将所有内容分解为一个值。相反,您可以使用cumsum() 来获取到目前为止向量中所有值的累积值。

    series <-  function(n){
      n <- seq(1,5,1)
      x <- rnorm(length(n))
      print(x)
      return((1/n)* (1/cumsum(x)))
    }
    

    【讨论】:

      【解决方案2】:

      基于@MrFlick 的基本思想,您还可以这样做:

      1/seq_along(x) * 1/cumsum(x)
      
      [1] -1.7841988 -0.6323886  0.4339966  0.2981289  0.2066433
      

      【讨论】:

      • 这里不需要mapply。只要1/seq_along(x) * 1/cumsum(x) 就可以了
      • @MrFlick 你是完全正确的,谢谢你的注意:)
      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 2017-09-15
      相关资源
      最近更新 更多