[Rd] data.frame within a function (PR#9294) (cont'd)
Prof Brian Ripley
ripley at stats.ox.ac.uk
Thu Nov 30 11:32:14 CET 2006
This is not to do with your subject line, and not a bug (and PR#9294 as
been closed). You don't even say what you think the 'issue' is: it seems
to be your lack of understanding of the scope rules.
I get
> f2()
ok
Error in inherits(x, "data.frame") : object "dtf" not found
which is quite correct: dtf is not visible from the body of f() where you
call update(evaluate=T) (the default, and use TRUE please). This is why
update has an 'evaluate' argument, so you can manage the scope used.
On Thu, 30 Nov 2006, Riyan Cheng wrote:
> This continues the message "data.frame within a function (PR#9294)" that
> was posted on 2006/10/12. Duncan Murdoch kindly replied. I'm using the
> current version R 2.4.0, but the same issue exists. Just copy and paste
> the following code under R, and compare the output of f1() and f2() and
> the output of f3() and f4(). Does anybody have any idea? Thanks.
>
> ###################################################
> # R code for demonstration only #
> ###########################
>
> rmvnorm<- function (n, mean = rep(0, nrow(sigma)), sigma =
> diag(length(mean))){
> if (nrow(sigma) != ncol(sigma)) {
> stop("sigma must be a square matrix")
> }
> if (length(mean) != nrow(sigma)) {
> stop("mean and sigma have non-conforming size")
> }
> ev <- eigen(sigma, sym = TRUE)$values
> if (!all(ev >= -sqrt(.Machine$double.eps) * abs(ev[1])))
> warning("sigma is numerically not positive definite")
> sigsvd <- svd(sigma)
> retval <- t(sigsvd$v %*% (t(sigsvd$u) * sqrt(sigsvd$d)))
> retval <- matrix(rnorm(n * ncol(sigma)), nrow = n) %*% retval
> retval <- sweep(retval, 2, mean, "+")
> retval
> }
>
> f<- function(obj){
> update(obj,~ .+x,evaluate=T); cat("also ok\n")
> }
>
> #########################
> # compare f1() and f2() #
> #########################
> f1<- function(){
> x<- rnorm(10)
> y<- rmvnorm(10,mean=c(1,2)); colnames(y)<- paste("y",1:2,sep="")
> #c("y1","y2")
> dtf<- data.frame(y,x)
> lm1<- lm(cbind(y1,y2)~1,data=dtf); cat("ok\n")
>
> update(lm1,~ .+x,evaluate=T); cat("also ok\n") # only this line is
> different
> }
> f2<- function(){
> x<- rnorm(10)
> y<- rmvnorm(10,mean=c(1,2)); colnames(y)<- paste("y",1:2,sep="")
> #c("y1","y2")
> dtf<- data.frame(y,x)
> lm1<- lm(cbind(y1,y2)~1,data=dtf); cat("ok\n")
>
> f(lm1) # only this line is different
> }
>
> f1()
> f2()
>
> #########################
> # compare f3() and f4() #
> #########################
> f3<- function(){
> x<- rnorm(10)
> y<- rmvnorm(10,mean=c(1,2)); colnames(y)<- paste("y",1:2,sep="")
> #c("y1","y2")
> lm1<- lm(cbind(y1,y2)~1,data=data.frame(y,x)); cat("ok\n")
>
> update(lm1,~ .+x,evaluate=T); cat("also ok\n") # only this line is
> different
> }
> f4<- function(){
> x<- rnorm(10)
> y<- rmvnorm(10,mean=c(1,2)); colnames(y)<- paste("y",1:2,sep="")
> #c("y1","y2")
> lm1<- lm(cbind(y1,y2)~1,data=data.frame(y,x)); cat("ok\n")
>
> f(lm1) # only this line is different
> }
>
> f3()
> f4()
>
> #########
> # the end #
> #########
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-devel
mailing list