2010-09-15 4 views

Répondre

9

Il peut y avoir une façon de faire plus concis, mais je le ferais de cette façon:

i <- 1:1000 
j <- i[12345 %% i == 0 ] 

Le vecteur résultant j contient un vecteur des valeurs i qui sont des facteurs de 12345. En R l'opérateur modulo est %% et c'est un peu une chienne à trouver lorsque vous effectuez une recherche par vous-même. Il est enterré dans le document d'aide pour les opérateurs arithmétiques et vous pouvez le trouver en recherchant + qui doit être entre guillemets comme: ?"+" et ensuite vous devez lire un peu.

Il est préférable d'ajouter une balise VBA si vous voulez trouver une réponse VBA. Mais je pense qu'il impliquera l'opérateur modulo VBA;)

+0

ah, gentil - merci – user446667

0

Vous avez écrit:

for (i in 1:1000) {if i mod 123345 = 0, a = list(i)} a 

Code de JD Long est beaucoup mieux, mais si vous vouliez cette stratégie loufoque de travailler plutôt essayer:

a <- vector(mode="list"); for (i in 1:1000) {if (123345 %% i == 0){ a <-c(a,i) } } 
as.vector(unlist(a)) 
2

JD méthode long est vraiment le premier qui est venu à l'esprit, mais une autre:

Filter(function(x) !(12345 %% x), 1:1000) 

I t hink c'est amusant de ne pas avoir besoin d'une affectation explicite. (Un peu trop mauvais pour créer une nouvelle fonction à chaque fois.) (Dans ce cas, "!" Convertit une valeur non nulle en FAUX et zéro en VRAI. "Filtre" sélectionne chaque élément évaluant TRUE.)

évitant également la nécessité d'une allocation distincte et non la création d'une nouvelle fonction:

which(!(12345 %% 1:1000)) 

Durée:

> y <- 1:1000 
> system.time(replicate(1e5, y[12345 %% y == 0 ])) 
    user system elapsed 
    8.486 0.058 8.589 
> system.time(replicate(1e5, Filter(function(x) !(12345 %% x), y))) 

Timing stopped at: 90.691 0.798 96.118 # I got impatient and killed it 
# Even pulling the definition of the predicate outside, 
# it's still too slow for me want to wait for it to finish. 
# I'm surprised Filter is so slow. 
> system.time(replicate(1e5, which(!12345 %% y))) 
    user system elapsed 
11.618 0.095 11.792 

Alors, ressemble à la méthode de JD long est le gagnant.

+0

Sur ma machine j'ai eu un timing différent, la méthode JD ~ 12.5s vs votre méthode ~ 11.5s. J'utilise R-2.11.1. – Marek

+0

Étrange; sur mon ordinateur portable et R-2.11.1 JD - 12.92s, David - 5.49s, mais pour 1000 répétitions. – mbq

+0

Si vous voulez vraiment accélérer, essayez de tout convertir en 'integer':' system.time (répliqué (1e5, y [12345L %% y == 0L])) ​​'. ('0L' signifie' as.integer (0) ') – Marek

Questions connexes