вернуть значения в векторе после передачи в функцию - PullRequest
2 голосов
/ 06 ноября 2019

В основном у меня есть

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 -> 1/2 * 1/x_1 + 1/x_2 = (1/2) * (1/(1.17810059+ 0.85472777)), но, к сожалению, результат в соответствии с моим кодом равен 0.4001804!

PS: я хочу написать код без циклов и без каких-либо функций, требующих вызова библиотеки! просто чтобы определить простую функцию, используя основные известные функции в R, а затем я могу сохранить результат, если необходимо, используя Vectorize() или outer()

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Опираясь на основную идею @MrFlick, вы также можете сделать:

1/seq_along(x) * 1/cumsum(x)

[1] -1.7841988 -0.6323886  0.4339966  0.2981289  0.2066433
1 голос
/ 06 ноября 2019

Функция sum() не векторизована. Это сворачивает все до единого значения. вместо этого вы можете использовать cumsum(), чтобы получить кумулятивные некоторые из всех значений в векторе на данный момент.

series <-  function(n){
  n <- seq(1,5,1)
  x <- rnorm(length(n))
  print(x)
  return((1/n)* (1/cumsum(x)))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...