Hi all, I have got 2 function (see bellow) which are simplifications of what I need to do. These functions are precisely the same, except for the last line. My question is, why doesn't function testA work in the same way as function testB. Both functions produce two objects, "a" and "b" that must merged with rbind. The difference is that in testA, I specify the name of the objects while in testA I am stating which objects I want to bind from a character vector. What's more, if I just run the code without a function (example given below as well), they both work... Why is this? Thanks in advance Jonas testA<-function(input) { dat<- data.frame(A=seq(input,5), B=seq(6,10)) vec.names<- c("a", "b") for(i in 1:ncol(dat)) { tab<- dat[,i]-1 assign(vec.names[i], tab) } do.call("rbind", lapply(vec.names, get)) } testB<-function(input) { dat<- data.frame(A=seq(input,5), B=seq(6,10)) vec.names<- c("a", "b") for(i in 1:ncol(dat)) { tab<- dat[,i]-1 assign(vec.names[i], tab) } rbind(a,b) } testA(1) Error in FUN(c("a", "b")[[1L]], ...) : object 'a' not found testB(1) [,1] [,2] [,3] [,4] [,5] a 0 1 2 3 4 b 5 6 7 8 9 ################################################################################### dat<- data.frame(A=seq(1,5), B=seq(6,10)) vec.names<- c("a", "b") for(i in 1:ncol(dat)) { tab<- dat[,i]-1 assign(vec.names[i], tab) } do.call("rbind", lapply(vec.names, get)) [,1] [,2] [,3] [,4] [,5] [1,] 0 1 2 3 4 [2,] 5 6 7 8 9 dat<- data.frame(A=seq(1,5), B=seq(6,10)) vec.names<- c("a", "b") for(i in 1:ncol(dat)) { tab<- dat[,i]-1 assign(vec.names[i], tab) } rbind(a,b) [,1] [,2] [,3] [,4] [,5] a 0 1 2 3 4 b 5 6 7 8 9 [[alternative HTML version deleted]]
Hi, I think you've got a problem with environments, testA<-function(input=1) { dat <- data.frame(A=seq(input,5), B=seq(6,10)) vec.names<- c("a", "b") env <- new.env() for(i in 1:ncol(dat)) { tab<- dat[,i]-1 assign(vec.names[i], tab, env=env) } do.call("rbind", lapply(vec.names, get, env=env)) } testA() But more generally, I doubt your construct using assign and get is the most natural way to reach your goal in R. HTH, baptiste 2009/9/4 jonas garcia <garcia.jonas80@googlemail.com>> Hi all, > > > > I have got 2 function (see bellow) which are simplifications of what I need > to do. These functions are precisely the same, except for the last line. > > > > My question is, why doesn't function testA work in the same way as function > testB. > > Both functions produce two objects, "a" and "b" that must merged with > rbind. > The difference is that in testA, I specify the name of the objects while in > testA I am stating which objects I want to bind from a character vector. > > > > What's more, if I just run the code without a function (example given below > as well), they both work... > > Why is this? > > > > Thanks in advance > > > > Jonas > > > > > > testA<-function(input) > > { > > dat<- data.frame(A=seq(input,5), B=seq(6,10)) > > vec.names<- c("a", "b") > > for(i in 1:ncol(dat)) > > { > > tab<- dat[,i]-1 > > assign(vec.names[i], tab) > > } > > > > do.call("rbind", lapply(vec.names, get)) > > } > > > > > > > > testB<-function(input) > > { > > dat<- data.frame(A=seq(input,5), B=seq(6,10)) > > vec.names<- c("a", "b") > > for(i in 1:ncol(dat)) > > { > > tab<- dat[,i]-1 > > assign(vec.names[i], tab) > > } > > > > rbind(a,b) > > } > > > > > > > > testA(1) > > Error in FUN(c("a", "b")[[1L]], ...) : object 'a' not found > > > > testB(1) > > [,1] [,2] [,3] [,4] [,5] > > a 0 1 2 3 4 > > b 5 6 7 8 9 > > > > > > > > > ################################################################################### > > > > > > > > dat<- data.frame(A=seq(1,5), B=seq(6,10)) > > vec.names<- c("a", "b") > > for(i in 1:ncol(dat)) > > { > > tab<- dat[,i]-1 > > assign(vec.names[i], tab) > > } > > > > do.call("rbind", lapply(vec.names, get)) > > [,1] [,2] [,3] [,4] [,5] > > [1,] 0 1 2 3 4 > > [2,] 5 6 7 8 9 > > > > > > > > > > dat<- data.frame(A=seq(1,5), B=seq(6,10)) > > vec.names<- c("a", "b") > > for(i in 1:ncol(dat)) > > { > > tab<- dat[,i]-1 > > assign(vec.names[i], tab) > > } > > > > rbind(a,b) > > [,1] [,2] [,3] [,4] [,5] > > a 0 1 2 3 4 > > b 5 6 7 8 9 > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@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. >-- _____________________________ Baptiste AuguiƩ School of Physics University of Exeter Stocker Road, Exeter, Devon, EX4 4QL, UK http://newton.ex.ac.uk/research/emag ______________________________ [[alternative HTML version deleted]]
Try this variation; might have something to do with scope: testA<-function(input) { dat<- data.frame(A=seq(input,5), B=seq(6,10)) vec.names<- c("a", "b") for(i in 1:ncol(dat)) { tab<- dat[,i]-1 assign(vec.names[i], tab) } do.call("rbind", lapply(vec.names, function(x) get(x))) } Just changed the way 'get' was done in the lapply On Fri, Sep 4, 2009 at 10:00 AM, jonas garcia<garcia.jonas80 at googlemail.com> wrote:> Hi all, > > > > I have got 2 function (see bellow) which are simplifications of what I need > to do. These functions are precisely the same, except for the last line. > > > > My question is, why doesn't function testA work in the same way as function > testB. > > Both functions produce two objects, "a" and "b" that must merged with rbind. > The difference is that in testA, I specify the name of the objects while in > testA I am stating which objects I want to bind from a character vector. > > > > What's more, if I just run the code without a function (example given below > as well), they both work... > > Why is this? > > > > Thanks in advance > > > > Jonas > > > > > > testA<-function(input) > > { > > ? ? ?dat<- data.frame(A=seq(input,5), B=seq(6,10)) > > ? ? ?vec.names<- c("a", "b") > > ? ? ?for(i in 1:ncol(dat)) > > ? ? ?{ > > ? ? ? ? ? ?tab<- dat[,i]-1 > > ? ? ? ? ? ?assign(vec.names[i], tab) > > ? ? ?} > > > > ? ? ?do.call("rbind", lapply(vec.names, get)) > > } > > > > > > > > testB<-function(input) > > { > > ? ? ?dat<- data.frame(A=seq(input,5), B=seq(6,10)) > > ? ? ?vec.names<- c("a", "b") > > ? ? ?for(i in 1:ncol(dat)) > > ? ? ?{ > > ? ? ? ? ? ?tab<- dat[,i]-1 > > ? ? ? ? ? ?assign(vec.names[i], tab) > > ? ? ?} > > > > ? ? ?rbind(a,b) > > } > > > > > > > > testA(1) > > Error in FUN(c("a", "b")[[1L]], ...) : object 'a' not found > > > > testB(1) > > ?[,1] [,2] [,3] [,4] [,5] > > a ? ?0 ? ?1 ? ?2 ? ?3 ? ?4 > > b ? ?5 ? ?6 ? ?7 ? ?8 ? ?9 > > > > > > > > ################################################################################### > > > > > > > > ? ? ?dat<- data.frame(A=seq(1,5), B=seq(6,10)) > > ? ? ?vec.names<- c("a", "b") > > ? ? ?for(i in 1:ncol(dat)) > > ? ? ?{ > > ? ? ? ? ? ?tab<- dat[,i]-1 > > ? ? ? ? ? ?assign(vec.names[i], tab) > > ? ? ?} > > > > ? ? ?do.call("rbind", lapply(vec.names, get)) > > ? ? [,1] [,2] [,3] [,4] [,5] > > [1,] ? ?0 ? ?1 ? ?2 ? ?3 ? ?4 > > [2,] ? ?5 ? ?6 ? ?7 ? ?8 ? ?9 > > > > > > > > > > dat<- data.frame(A=seq(1,5), B=seq(6,10)) > > ? ? ?vec.names<- c("a", "b") > > ? ? ?for(i in 1:ncol(dat)) > > ? ? ?{ > > ? ? ? ? ? ?tab<- dat[,i]-1 > > ? ? ? ? ? ?assign(vec.names[i], tab) > > ? ? ?} > > > > ? ? ?rbind(a,b) > > ?[,1] [,2] [,3] [,4] [,5] > > a ? ?0 ? ?1 ? ?2 ? ?3 ? ?4 > > b ? ?5 ? ?6 ? ?7 ? ?8 ? ?9 > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > 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 that you are trying to solve?