2017-10-08 4 views
1

En R, pour un projet d'école, j'essaie de transformer une fonction qui utilise une boucle for en une fonction qui utilise la fonction apply.Activation de la fonction de boucle dans la fonction d'application

Ma fonction simule une distribution de Poisson où la personne peut entrer les paramètres n, lambda et m. m est le nombre de simulations. Il sort ensuite la moyenne de tous les moyennes des m simulations de Poisson et délivre une grille 2x2 de boîtes à moustaches afin que l'utilisateur puisse montrer plusieurs tracés avec différentes valeurs de paramètres. Il est posté ci-dessous.

J'ai du mal à comprendre comment transformer cela en une fonction qui utilise la fonction d'application. Comme appliquer nécessite une matrice, aurais-je besoin d'avoir déjà une matrice m.out pour certaines valeurs de paramètres de ma fonction de boucle for. En outre, je ne suis pas sûr exactement ce que la fonction utiliserait apply. Je voudrais prendre la moyenne de chaque valeur dans la matrice.

Toute aide est appréciée.

Venom<-function(n,l,m){ 
    if(!is.numeric(c(n,l,m))){return("Error non-numeric value entered for at `enter code here`least one parameter")} 
    m.out<-NULL 
    for(i in 1:m){ 
     data1<-rpois(n,l) 
     m.sim<-mean(data1) 
     m.out<-rbind(m.out, m.sim) 
    } 
    finalmean<-mean(m.out) 
    hist(m.out, main=paste("Poisson n=",n)) 
    return(c(finalmean, m.out)) 
} 
par(mfrow=c(2,2)) 

Répondre

3

Voici quelques alternatives R et Tidyverse à la boucle for.

set.seed(0) 
n = 10 
l = 5 
m = 20 

Tout d'abord, voici votre boucle d'origine. J'ai remplacé rbind par c car m.out est traité comme un vecteur plutôt que comme une matrice.

m.out <- NULL 
for(i in 1:m){ 
    data1 <- rpois(n,l) 
    m.sim <- mean(data1) 
    m.out <- c(m.out, m.sim) 
} 
print(m.out) 
# [1] 6.1 5.1 4.9 5.0 5.3 4.4 4.8 5.8 4.7 5.2 5.5 4.6 5.2 5.2 4.4 4.5 5.1 5.7 6.0 4.7 

base R

Comme vous l'avez mentionné, apply prend une matrice. Cependant, sapply peut utiliser des vecteurs en entrée et en sortie.

sapply(seq_len(m), function(x) { 
    mean(rpois(n, l)) 
}) 

Une autre solution de base de R est d'utiliser replicate qui répète une expression m fois. simplify = T va faire sortir un vecteur plutôt qu'une liste.

replicate(
    m, 
    mean(rpois(n, l)), 
    simplify = T) 

Tidyverse

rerun est la version de purrr de replicate. Il va produire une liste, nous avons donc besoin de unlist le résultat.

library('tidyverse') 
rerun(m, mean(rpois(n, l))) %>% 
    unlist 

Une autre façon est d'utiliser map_dbl qui applique une fonction à chaque élément dans le vecteur et le retour d'un vecteur de double.

map_dbl(seq_len(m), ~mean(rpois(n, l))) 
+0

D'accord merci pour la réponse, je l'apprécie. –