[R] Function completely locks up my computer if the input is too big

William Dunlap wdunlap at tibco.com
Tue Mar 5 22:50:17 CET 2013


I see you have profiling calls in there.  Have you used them?

It is often fruitful to see how the time for a function grows as size of the input or output grows.  Have you tried that? 

A concrete suggestion is to change
   for(i in 1:n){
      if(is.na(or.deg[i])==TRUE) {or.deg[i] <- 0}
   }
to
     or.deg[is.na(or.deg)] <- 0

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of Benjamin Caldwell
> Sent: Tuesday, March 05, 2013 1:18 PM
> To: r-help
> Subject: [R] Function completely locks up my computer if the input is too big
> 
> Dear r-help,
> 
> 
> Somewhere in my innocuous function to rotate an object in Cartesian space
> I've created a monster that completely locks up my computer (requires a
> hard reset every time). I don't know if this is useful description to
> anyone - the mouse still responds, but not the keyboard and not windows
> explorer.
> 
> The script only does this when the input matrix is large, and so my initial
> runs didn't catch it as I used a smaller matrix to speed up the test runs.
> When I tried an input matrix with a number of dimensions in the same order
> of magnitude as the data I want to read in, R and my computer choked. This
> was a surprise for me, as I've always been able to break execution in the
> past or do other tasks. So i tried it again, and still no dice.
> 
> Now I need the function to work as subsequent functions/functionality are
> dependent, and I can't see anything on the face of it that would likely
> cause the issue.
> 
> Any insight on why this happens in general or specifically in my case are
> appreciated. Running R 15.2, Platform: x86_64-w64-mingw32/x64 (64-bit) on a
> windows 7 machine with 4 mb RAM. In the meantime I suppose I'll write a
> loop to do this function piece-wise for larger data and see if that helps.
> 
> Script is attached and appended below.
> 
> Thanks
> 
> Ben Caldwell
> 
> 
> 
> #compass to polar coordinates
> 
> compass2polar <- function(x) {-x+90}
> 
> 
> 
> #degrees (polar) to radians
> 
> Deg2Rad <- function(x) {(x*pi)/180}
> 
> 
> 
> # radians to degrees
> 
> Rad2Deg <- function (rad) (rad/pi)*180
> 
> 
> 
> # polar to cartesian coordinates - assumes degrees those from a compass.
> output is a list, x & y of equal length
> 
> Pol2Car <- function(distance,deg) {
> 
> 
> rad <- Deg2Rad(compass2polar(deg))
> 
> rad <- rep(rad, length(distance))
> 
> 
> x <- ifelse(is.na(distance), NA, distance * cos(rad))
> 
> y <- ifelse(is.na(distance), NA, distance * sin(rad))
> 
> 
> x<-round(x,2)
> 
> y<-round(y,2)
> 
> 
> cartes<- list(x,y)
> 
> name<-c('x','y')
> 
> names(cartes)<-name
> 
> cartes
> 
> }
> 
> 
> 
> 
> 
> #rotate an object, with assumed origin at 0,0, in any number of degrees
> 
> rotate <- function(x,y,tilt){ 8
> 
> 
> d2 <- x^2+y^2
> 
> rotate.dis<-sqrt(d2)
> 
> or.rad <- atan(x/y)
> 
> or.deg <- Rad2Deg(or.rad)
> 
> 
> n <- length(or.deg)
> 
> for(i in 1:n){
> 
> if(is.na(or.deg[i])==TRUE) {or.deg[i] <- 0}
> 
> }
> 
> # browser()
> 
> tilt.in <- tilt + or.deg
> 
> 
> xy<-Pol2Car (distance=rotate.dis, deg=tilt.in)
> 
>  # if(abs(tilt) >= 0) {
> 
>  # shift.frame <- cbind(xy$x, xy$y)
> 
> # shift.frame.val <- shift.frame[shift.frame[,2]==min(shift.frame[,2]),]
> 
> # shift.x<- shift.frame.val[1] * -1
> 
> # shift.y<- shift.frame.val[2] * -1
> 
> # x<-xy$x + shift.x
> 
> # y<-xy$y + shift.y
> 
> # }
> 
> # name <- c('x', 'y')
> 
> # xy<-list(x,y)
> 
> # names(xy)<-name
> 
>  xy
> 
> }
> 
> 
> x <- seq(0,5, .5)
> 
> y <- seq(0,5, .5)
> 
> z <- seq(0,5, .5)
> 
> dquad<-expand.grid(x,y,z)
> 
> name<-c("y","x","z")
> 
> names(dquad)<-name
> 
> 
> plot(dquad$x, dquad$y, xlim=c(-25,25), ylim=c(-25,25))
> 
> 
> #this works fine
> 
> rotated<-rotate(dquad$x, dquad$y, 45)
> 
> 
> 
> points(rotated$x, rotated$y, col='green')
> 
> 
> # profiling of both time and memory
> 
> Rprof("myFunction.out", memory.profiling=T)
> 
> y <- myFunction(x)
> 
> Rprof(NULL)
> 
> summaryRprof("myFunction.out", memory="both")
> 
> 
> 
> #############
> 
> x <- seq(0,5, .1)
> 
> y <- seq(0,5, .1)
> 
> z <- seq(0,5, .1)
> 
> dquad<-expand.grid(x,y,z)
> 
> name<-c("y","x","z")
> 
> names(dquad)<-name
> 
> # running the below locks up my machine (commented out to avoid accidental
> run)
> 
> # rotated<-rotate(dquad$x, dquad$y, 45)



More information about the R-help mailing list