#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 «Назначения внутри функций».