Yong Wang
2010-Mar-17 08:04 UTC
[R] Why eval(parse(text="var(vec)")) return a matrix but NOT a number?
Dear List I am getting a problem when using "eval(parse)". Code below sketchs what I am trying to do: For each row of a N*K dataframe (I use a 2*2 dataframe in the example below), applying a number of functions and get the outputs (two functions, "sum" and "var" are used in the example below). The problem is eval(parse(text="sum(para)")) works fine but not when "sum" is replaced by "var". in the later case, a matrix instead of a number is returned. Any suggestion highly appreciated. Thank you #===================================================The function myloop <-function(datfra,funs) { rows<-dim(datfra)[1]; totfunnum<-length(funs); for (i in 1:rows) { vec<-datfra[i,]; for(k in 1:totfunnum) { print(funs[k]); x<-eval(parse(text=funs[k])); print(x); } } } #================================================Experiemental run workport<-data.frame(matrix(1:4,2,2)) funs<-c("sum(vec,na.rm=T)","var(vec,na.rm=T)") myloop(workport,funs) #================================================ Outputs of the Experimental run [1] "sum(vec,na.rm=T)" [1] 4 [1] "var(vec,na.rm=T)" X1 X2 X1 NA NA X2 NA NA [1] "sum(vec,na.rm=T)" [1] 6 [1] "var(vec,na.rm=T)" X1 X2 X1 NA NA X2 NA NA
Charles C. Berry
2010-Mar-17 16:09 UTC
[R] Why eval(parse(text="var(vec)")) return a matrix but NOT a number?
On Wed, 17 Mar 2010, Yong Wang wrote:> Dear List > > I am getting a problem when using "eval(parse)". > Code below sketchs what I am trying to do: > > For each row of a N*K dataframe (I use a 2*2 dataframe in the example below), > applying a number of functions and get the outputs (two functions, > "sum" and "var" are used in the example below). > > The problem is eval(parse(text="sum(para)")) works fine but not when > "sum" is replaced by "var". > in the later case, a matrix instead of a number is returned. > > Any suggestion highly appreciated. > > Thank you > > #===================================================The function > myloop <-function(datfra,funs) { > > rows<-dim(datfra)[1]; > totfunnum<-length(funs); > > for (i in 1:rows) { > vec<-datfra[i,];# I suggest: browser() # Now try print(vec), str(vec), etc till you understand # why the results do not agree with your expectation # HTH, # Chuck> > for(k in 1:totfunnum) { > print(funs[k]); > x<-eval(parse(text=funs[k])); > print(x); > } > > } > } > > > #================================================Experiemental run > workport<-data.frame(matrix(1:4,2,2)) > funs<-c("sum(vec,na.rm=T)","var(vec,na.rm=T)") > myloop(workport,funs) > > #================================================ Outputs of the > Experimental run > > [1] "sum(vec,na.rm=T)" > [1] 4 > [1] "var(vec,na.rm=T)" > X1 X2 > X1 NA NA > X2 NA NA > [1] "sum(vec,na.rm=T)" > [1] 6 > [1] "var(vec,na.rm=T)" > X1 X2 > X1 NA NA > X2 NA NA > > ______________________________________________ > 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. >Charles C. Berry (858) 534-2098 Dept of Family/Preventive Medicine E mailto:cberry at tajo.ucsd.edu UC San Diego http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego 92093-0901