Сумма случайных чисел в R

#r

#r

Вопрос:

Я пытаюсь написать программу на R для суммирования n случайных чисел. Однако, когда я попробую это для некоторых чисел, это не сработает. Например,

 ## rm(list=ls())
random.sum <- function(n) {  
x[1:n] <- ceiling(10*runif(n)) 
cat("x:", x[1:n], "n") 
return(sum(x)) 
}
x <- rep(100, 10)
show(random.sum(10)) 
show(random.sum(5))
  

когда я пытаюсь суммировать 10 случайных чисел, это даст мне правильную сумму, которая

 show(random.sum(10)) 

x: 1 3 10 1 3 2 8 6 7 9 

[1] 50
  

Однако, когда я попробую это для следующего, который равен 5, это не сработает,

 show(random.sum(5))

x: 7 5 6 2 9 
[1] 529
  

Я не уверен, что я делаю неправильно

Комментарии:

1. Вы определяете x вне функции, чтобы иметь 10 элементов, все из которых установлены на 100. Затем внутри функции вы обновляете n ее элементы. Поэтому, когда вы устанавливаете n = 5 , вы обновляете только первые 5 элементов. Оставшиеся 5 по-прежнему имеют значение 100

2. Любопытно, почему мы хотели бы это сделать?

Ответ №1:

Самым простым способом было бы что-то вроде этого (обновлено в соответствии с комментарием @Axeman):

 sum(sample(1:10, 10, replace = TRUE))
  

где первое «10» — это ваше n и min и max определяет диапазон значений для runif .

Также сохраняйте x локальность для функции:

 random.sum <- function(n) {
  x <- sample(1:10, 10, replace = TRUE)
  cat("x:", x, "n") 
  return(sum(x))
}
  

Комментарии:

1. Или sum(sample(1:10, 10, replace = TRUE)) .

2. @Axeman На самом деле намного лучше, спасибо. Наверное, я старался держать его слишком близко к оригиналу OPs.

Ответ №2:

Причиной вашей ошибки являются правила определения области видимости переменной R. Ваша переменная x в глобальной области видимости копируется при изменении, но сохраняет размер глобального объявления. Если вы суммируете только первые n элементы, sum(x[1:n]) вы получите правильный ответ.

Теперь возникает вопрос, пытаетесь ли вы изменить глобальный объект x внутри функции? Если это ваше намерение, <<- можно использовать оператор суперассылки. Подробности см. во введении R, раздел 10.5 «Назначения внутри функций».