2017-10-17 6 views
-2

J'essaie de faire défiler des entiers 1: 1000 en comparant le résultat d'une fonction que j'ai créée avec une fonction R. Plus précisément, j'ai:Comment arrêter une boucle à partir de l'impression R

floor.log2 = function(n) { 
    x = 1 
    i = 0 
    while (x <= n) { 
    x = 2*x 
    i = i + 1 
    } 
    print(i-1) 
} 

Et je veux comparer avec:

floor(log(n, base = 2)) 

Chaque boucle de comparaison que j'ai créé finit par imprimer chaque index 1: 1000 - ce qui est une façon succincte de comparer les résultats pour 1: 1000 dans ces fonctions sans R imprimer les indices?

+5

Vous pourriez commencer par retirer la déclaration 'print' – kdopen

+0

@kdopen wow. Je ne suis pas sûr de savoir comment je n'ai pas attrapé ça. Je vous remercie. – mizichael

+0

puis vous devez retourner quelque chose – kdopen

Répondre

0

Je modifierais la fonction existante que vous avez écrit à:

floor.log2 = function(n) { 
x = 1 
i = 0 
while (x <= n) { 
    x = 2*x 
    i = i + 1 
} 
return(i-1) 
} 

Pour tester:

iter <- 100 # How long you would like to test for 
vec1 <- c() # Container of your custom function 
vec2 <- c() # Container for the comparison function 

for(i in 1:iter) { 
    vec1[i] <- floor.log2(i) 
    vec2[i] <- floor(log(i, base = 2)) 
} 

Enfin:

all(vec1 == vec2) 
+0

Vous pourriez améliorer cela en [vectorisant] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/Vectorize.html) le 'floor Fonction .log2' pour éviter d'utiliser la boucle 'for':' floor.log2_V <- Vectorize (floor.log2, vectorize.args = 'n') '. – bouncyball

+0

Merci pour les informations concernant 'Vectorize()'. Je n'ai pas traversé ça à l'état sauvage. – jacobsg