Если вы делаете seq_len(2)
, это дает вам:
[1] 1 2
И вы не можете сделать 1: (1: 2) .. это не имеет смысла
Также вы можете избегайте циклов в вашем коде, выбирая количество попыток, которое вам нужно, например, если вы делаете:
rnorm(3,c(0,10,20),1)
[1] -0.507961 8.568335 20.279245
Это дает вам 1-ю выборку из 1-го среднего, 2-ю выборку из 2-го среднего и так далее. Таким образом, вы можете упростить свою функцию до:
rgaussmix <- function(n, mus, sds, prob = NULL){
if(length(mus) != length(sds)){
stop("mus and sds have different lengths")
}
if(is.null(prob)){
prob = rep(1/length(mus),length(mus))
}
rolls <- sample(length(mus), n, replace=TRUE, p=prob)
avg <- rnorm(n, mean=mus[rolls], sd=sds[rolls])
avg
}
Вы можете построить результаты:
plot(density(rgaussmix(10000,c(0,5,10),c(1,1,1))),main="mixture of 0,5,10")
![enter image description here](https://i.stack.imgur.com/ZoELM.png)