Lately R has been behaving strange on my Linux (Ubuntu 7.10) machine, with occasional segfaults. Today something else and reproducible happened: If I type the code below (meant for calibrating data), I get the error message that "the C stack usage is too close to the limit". calcurve <- cbind(1:2e4, 1:2e4, 1:2e3); #dummy curve, real one is more complex caldist <- function(cage=Cage, error=Error, sdev=Sdev, times=Times, By=By) { theta <- seq(min(calcurve[,1]), max(calcurve[,1]), by=By); interpolate <- function(th, col) { if(th==calcurve[1,1]) {calcurve[1,col]}else if(th==calcurve[nrow(calcurve),1]) {calcurve[nrow(calcurve),col]}else { k <- min(which(calcurve[,1] > th)); slope <- (calcurve[k-1,col]-calcurve[k,col])/(calcurve[k-1,1]-calcurve[k,1]); calcurve[k-1,col] + slope*(th-calcurve[k-1,1]); } } mu <- c(); cerror <- c(); for(i in 1:length(theta)) { mu[i] <- interpolate(theta[i],2); cerror[i] <- interpolate(theta[i],3); } caldist <- dnorm(mu, cage, (error^2+cerror^2)^.5); cbind(theta, caldist/sum(caldist)); } caldist(1e3,1e2); Unfortunately I am no huge computer wizard. Has anyone got any idea why this happens? Is it reproducible on other machines? How can I solve this problem? My R: R version 2.6.1 (2007-11-26) i486-pc-linux-gnu locale: LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] rcompgen_0.1-17 Cstack_info() size current direction eval_depth 8388608 2404 1 2 Many thanks, Maarten Blaauw -- Dr. Maarten Blaauw School of Geography, Archaeology & Palaeoecology Queen's University Belfast, U.K. On leave from Department of Earth Sciences Uppsala University, Sweden maarten.blaauw at geo.uu.se
Your function has 4 parameters and you are only calling with two. The first statement: caldist <- function(cage=Cage, error=Error, sdev=Sdev, times=Times, By=By) { theta <- seq(min(calcurve[,1]), max(calcurve[,1]), by=By); use "By" which is not defined. On Jan 26, 2008 4:29 PM, Maarten Blaauw <maarten.blaauw at geo.uu.se> wrote:> Lately R has been behaving strange on my Linux (Ubuntu 7.10) machine, > with occasional segfaults. Today something else and reproducible > happened: > > If I type the code below (meant for calibrating data), I get the error > message that "the C stack usage is too close to the limit". > > calcurve <- cbind(1:2e4, 1:2e4, 1:2e3); #dummy curve, real one is more complex > > caldist <- function(cage=Cage, error=Error, sdev=Sdev, times=Times, By=By) > { > theta <- seq(min(calcurve[,1]), max(calcurve[,1]), by=By); > > interpolate <- function(th, col) > { > if(th==calcurve[1,1]) {calcurve[1,col]}else > if(th==calcurve[nrow(calcurve),1]) {calcurve[nrow(calcurve),col]}else > { > k <- min(which(calcurve[,1] > th)); > slope <- > (calcurve[k-1,col]-calcurve[k,col])/(calcurve[k-1,1]-calcurve[k,1]); > calcurve[k-1,col] + slope*(th-calcurve[k-1,1]); > } > } > > mu <- c(); > cerror <- c(); > for(i in 1:length(theta)) > { > mu[i] <- interpolate(theta[i],2); > cerror[i] <- interpolate(theta[i],3); > } > > caldist <- dnorm(mu, cage, (error^2+cerror^2)^.5); > cbind(theta, caldist/sum(caldist)); > } > > caldist(1e3,1e2); > > Unfortunately I am no huge computer wizard. Has anyone got any idea > why this happens? Is it reproducible on other machines? How can I > solve this problem? > > My R: > R version 2.6.1 (2007-11-26) > i486-pc-linux-gnu > > locale: > LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C > > attached base packages: > [1] stats graphics grDevices utils datasets methods base > > loaded via a namespace (and not attached): > [1] rcompgen_0.1-17 > > Cstack_info() > size current direction eval_depth > 8388608 2404 1 2 > > Many thanks, > > Maarten Blaauw > > -- > Dr. Maarten Blaauw > School of Geography, Archaeology & Palaeoecology > Queen's University Belfast, U.K. > On leave from Department of Earth Sciences > Uppsala University, Sweden > maarten.blaauw at geo.uu.se > > ______________________________________________ > R-help at r-project.org mailing list > 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. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem you are trying to solve?
Sorry, indeed I forgot to put some of the factors in the code. Here it is again, now updated: calcurve <- cbind(1:2e4, 1:2e4, rep(100, length=2e4)); caldist <- function(cage, error, sdev=2, times=5, By=1) { calcurve <- calcurve[which((calcurve[,2]+calcurve[,3]) >= cage-(times*error)),]; calcurve <- calcurve[which((calcurve[,2]-calcurve[,3]) <= cage+(times*error)),]; theta <- seq(min(calcurve[,1]), max(calcurve[,1]), by=By); interpolate <- function(th, col) { if(th==calcurve[1,1]) {calcurve[1,col]}else if(th==calcurve[nrow(calcurve),1]) {calcurve[nrow(calcurve),col]}else { k <- min(which(calcurve[,1] > th)); slope <- (calcurve[k-1,col]-calcurve[k,col])/(calcurve[k-1,1]-calcurve[k,1]); calcurve[k-1,col] + slope*(th-calcurve[k-1,1]); } } mu <- c(); cerror <- c(); for(i in 1:length(theta)) { mu[i] <- interpolate(theta[i],2); cerror[i] <- interpolate(theta[i],3); } caldist <- dnorm(mu, cage, (error^2+cerror^2)^.5); cbind(theta, caldist/sum(caldist)); } caldist(2450,50); Strangely enough the stacking error message seems not to happen every time. It also has happened on the WinXP partition of the same Toshiba laptop. So it is not as reproducible as I first hoped/feared. -- Dr. Maarten Blaauw School of Geography, Archaeology & Palaeoecology Queen's University Belfast, U.K. On leave from Department of Earth Sciences Uppsala University, Sweden maarten.blaauw at geo.uu.se