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?