It's very commendable that you try writing your own functions to learn R. Of 
course the function factorize() is in gmp, but that's beside the point.

Your code looks messy - before asking your question you could have removed all 
these print statements. It gets further messed up because you posted in HTML. 
The logic is awkward. Instead of returning from the inside of an infinite loop 
in spaghetti code fashion, write your loop to test for your termination 
condition. Use "<-" and "=" consistently! Don't write return (), but keep 
parentheses attached to their functions. "if( isprime(n) ){ return(n)}" is 
enough for your first test. DRY (Do not repeat yourself). Whenever you find 
yourself writing essentially the same code in different places of your 
function, your logic is almost always wrong (you have three different places 
where you append to your prime list).

But, funny enough, that's not actually the source of your problem. The problem 
is: you are using the gmp function nextprime(), which - although it doesn't say 
so in it's help page - returns a big integer of class bigz.

  str(nextprime(2))

The problem is you can't mix integers and big integers in the same list.

  c(nextprime(2), nextprime(3))
  c(27, nextprime(2), nextprime(3))

So keep it all as plain integers:
  currentPrime = as.integer(nextprime(currentPrime))

... and it will work as expected.
But do clean it up.


B.

PS:
factorize(18)
Big Integer ('bigz') object of length 3:
[1] 2 3 3

... 


On Dec 3, 2015, at 6:42 AM, Kevin Wright <wrightkevin3...@gmail.com> wrote:

> Hi,
> 
> I am very new to 'R' and am trying to write an R function which returns the
> prime factors of a given number(n)
> 
> Unfortunately, the function only works for very small numbers, if for
> example I pass 18 to the function
> a mysteriously long vector is returned. I have not been able to find where
> or why this is happening.
> I know I've done something wrong. I've tried using debugging statements.
> Sometimes the
> currentPrime variable seems to become some sort of array?!
> 
> 
> can you help?
> 
> 
> library(gmp)
> 
> 
> #passing 18 returns: 2 1 0 0 0 1 0 0 0 1 0 0 0 3 0 0 0 1 0 0 0 1 0 0 0 1 0
> 0 0 3 0 0 0
> # expected: 2 3 3
> getPrimeFactors = function(n){
>   primeList <- c()
> 
>   if( isprime(n) ){
>      primeList <- append(primeList,n)
>      return (primeList)
>   }
> 
>   currentPrime <- 2
> 
>   while(TRUE){
>      # Check if input is divisible by the current prime
>      if(n %% currentPrime == 0){
>         cat(sprintf("the number %f is divisible by %f\n", n,
> currentPrime))
>         n = n%/%currentPrime
> 
>         cat(sprintf("value of n is %f\n", n))
> 
>         cat(sprintf("current prime :%f\n", currentPrime))
>         primeList = append(primeList,currentPrime)
>        # print(c("list contents:", primeList))
> 
> 
>         currentPrime = 2
> 
>         if( isprime(n)){
> 
>              primeList = append(primeList, n)
>              return (primeList)
> 
>         }
> 
>      }
>      else{
>         cat(sprintf("the number %f is NOT divisible by %f\n", n,
> currentPrime))
>         #cat(sprintf("current prime before is: %f\n", currentPrime))
>         #print(c("current prime before:", currentPrime))
>         currentPrime = nextprime(currentPrime)
>         #cat(sprintf("current prime after is: %f\n", currentPrime))
>         #print(c("current prime after:", currentPrime))
> 
>      }
> 
> 
> 
>   }
> 
> 
> 
> 
> }
> 
> 
> 
> 
> 
> 
> }
> 
>       [[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to