Gavin, thank you for the suggestions. Unfortunately the function is still not working correctly. Below are the dummy datasets that you requested. In the function dummy.vegdata = vegetation; and dummy.spplist = specieslist. A little clarification on why the if statement is in the function. I am using the apply function to sum columns of data that correspond with different lifeforms in order to derive a total cover value for each lifeform in each plot (plt). When only one species occurs in a lifeform the apply function doesn't work since there is only one column of data. So, the if statement is an attempt to include the column of data from the dummy.vegdata into the output when there is only one species in a given lifeform. Examples of this condition in the dummy.vegdata include water (Bare_Ground) and popbal (Deciduous_Tree). Aaron > dummy.vegdata
plt water salarb salpul popbal leddec picgla picmar arcuva zygele epiang calpur poaarc pelaph flacuc tomnit hylspl carvag caraqu calcan carsax T1 0 0 10.0 0.0 20 0.0 35 0 0.0 0.0 0 0.0 5.0 0.0 20 55 0.0 1 5.0 0 T2 0 0 0.0 0.0 3 0.0 62 0 0.0 0.0 0 0.0 8.0 2.0 5 65 0.0 0 3.0 0 T3 0 0 0.0 0.0 0 0.0 1 80 2.0 0.0 4 0.0 0.0 0.0 0 0 0.0 0 0.0 0 T4 0 1 0.0 30.0 0 0.1 0 0 0.0 0.0 0 0.0 0.0 0.0 0 0 0.0 0 0.0 0 T5 0 0 0.0 0.0 0 0.0 0 0 0.0 0.0 0 0.0 0.0 0.0 0 0 0.0 0 0.0 0 T6 0 0 0.0 0.0 0 20.0 0 0 0.0 1.0 0 0.0 2.0 0.1 0 20 0.0 0 0.0 0 T7 0 0 0.0 0.0 5 0.0 40 0 0.0 0.0 0 0.0 5.0 0.0 0 85 0.0 0 0.0 0 T8 0 0 3.0 0.0 40 0.0 5 0 0.0 0.0 0 0.0 0.0 0.0 1 0 0.0 2 0.0 0 T9 0 0 1.0 0.0 20 0.0 10 0 0.0 0.0 0 0.0 0.1 0.0 0 3 0.0 1 0.0 0 T10 0 0 0.0 65.0 0 2.0 0 0 0.0 0.0 0 0.0 0.0 0.0 0 0 0.0 0 5.0 0 T11 0 1 1.0 0.0 30 0.0 45 0 0.0 0.0 0 0.1 1.0 0.0 0 10 1.0 0 0.0 0 T12 0 5 7.0 0.1 0 3.0 5 0 0.0 0.0 0 0.0 0.0 0.0 0 5 1.0 0 2.0 5 T13 0 0 20.0 0.0 5 2.0 5 0 0.0 0.0 0 0.0 0.0 0.0 25 0 2.0 2 3.0 15 T14 0 0 35.0 0.0 0 0.0 0 0 0.0 0.0 0 0.0 0.0 0.0 0 0 0.1 0 3.0 2 T15 0 0 0.0 1.0 0 20.0 0 5 0.1 0.0 0 0.0 0.0 0.0 0 10 0.0 0 0.0 0 T16 0 0 0.0 0.0 1 80.0 0 0 0.0 0.1 0 0.0 1.0 0.0 0 50 0.0 0 0.1 0 T17 100 0 0.0 0.0 0 0.0 0 0 0.0 0.0 0 0.0 0.0 0.0 0 0 0.0 0 0.0 0 T18 0 0 0.0 0.0 0 15.0 0 5 0.0 2.0 0 0.0 1.0 0.0 0 20 0.0 0 1.0 0 T19 0 0 0.0 10.0 0 50.0 0 0 0.0 0.0 0 0.0 0.1 0.0 0 55 0.0 0 20.0 0 T20 0 0 0.0 0.0 45 0.0 15 0 0.0 0.0 0 0.0 1.0 0.0 0 50 0.0 0 0.0 0 T21 0 0 0.0 0.0 0 0.0 0 0 0.0 0.0 0 0.0 0.0 0.0 0 0 0.0 0 35.0 0 T22 100 0 0.0 0.0 0 0.0 0 0 0.0 0.0 0 0.0 0.0 0.0 0 0 0.0 0 0.0 0 T23 0 0 0.0 0.0 0 15.0 0 1 0.0 0.0 0 0.0 0.0 0.0 0 2 0.0 0 0.0 0 T24 0 0 0.1 0.0 0 0.0 0 0 0.0 0.0 0 0.0 0.0 0.0 0 0 0.0 0 25.0 0 T25 0 0 0.0 0.0 0 25.0 0 0 0.0 1.0 0 0.0 0.0 0.0 0 15 0.0 0 2.0 0 > dummy.spplist code SciName LifeForm Class water Water Bare_Ground Other salarb Salix_arbusculoides Deciduous_Shrubs Vascular salpul Salix_planifolia_pulchra Deciduous_Shrubs Vascular popbal Populus_balsamifera Deciduous_Tree Vascular leddec Ledum_decumbens Evergreen_Shrubs Vascular picgla Picea_glauca Evergreen_Tree Vascular picmar Picea_mariana Evergreen_Tree Vascular arcuva Arctostaphylos_uva-ursi Evergreen_Shrubs Vascular zygele Zygadenus_elegans Forbs Vascular epiang Epilobium_angustifolium Forbs Vascular calpur Calamagrostis_purpurascens Grasses Vascular poaarc Poa_arctica Grasses Vascular pelaph Peltigera_aphthosa Lichens Non-Vascular flacuc Flavocetraria_cucullata Lichens Non-Vascular tomnit Tomentypnum_nitens Mosses Non-Vascular hylspl Hylocomium_splendens Mosses Non-Vascular carvag Carex_vaginata Sedges Vascular caraqu Carex_aquatilis_aquatilis Sedges Vascular calcan Calamagrostis_canadensis Grasses Vascular carsax Carex_saxatilis Sedges Vascular > Subject: Re: [R] function output with for loop and if statement > From: gavin.simp...@ucl.ac.uk > To: awell...@hotmail.com > CC: r-help@r-project.org > Date: Thu, 23 Apr 2009 09:18:17 +0100 > > On Wed, 2009-04-22 at 15:51 -0400, aaron wells wrote: >> Hello all, turns out i'm having a bad R week. I am at my wits end >> with a function that I am trying to write. When I run the lines of >> code outside of a function, I get the desired output. When I wrap the >> lines of code into a function it doesn't work as expected. Not sure >> what is going on here. I suspected that the syntax of the if >> statement with the for loop was the culprit, but when I only ran the >> part of the code with the for loop with no if statement I still had >> the above problem (works outside function, fails when wrapped into a >> function). Below is the code and example output. Please help! > > It would help a lot if you spaced your code out a bit around key > operators and structural elements. > > Anyway, you didn't enclose the if/else blocks in {} in such cases, only > the line following the if(...) is run if the clause is TRUE - the lines > after that, but the code you provided doesn't even load into R - the > lone else is a syntax error. So it is a bit difficult to see what is > going on and you don;t provide an example any of us can reproduce as we > don't have your data objects. > > I edited your functions below to do what I think you intended and to > clean it up a bit. Perhaps we can use this as starting point if the > function here: > > `concov.test` <- function(vegetation, specieslist) > { > test.veg <- vegetation > names(test.veg) <- specieslist$LifeForm > nams <- unique(names(test.veg)) > tmp <- matrix(nrow = nrow(test.veg), ncol = length(nams)) > for (i in nams) { > test.out <- apply(test.veg[, names(test.veg)==i], 1, sum) > tmp.match <- nams[nams==i] > tmp.col <- match(tmp.match, nams) > tmp[1:nrow(test.veg), tmp.col] <- test.out > tmp.out <- data.frame(row.names(test.veg), tmp, row.names = 1) > names(tmp.out) <- nams > ## do you need this or is this for debugging? > print(tmp.out) > tmp.out.sort <- tmp.out[, order(names(tmp.out))] > } > if(table(names(tmp.out))[i] == 1) { > nams.srt <- names(tmp.out.sort) > tmp.match2 <- nams.srt[nams.srt == i] > tmp.col2 <- match(tmp.match2, names.srt) > tmp.out.sort[1:nrow(test.veg), tmp.col2] <- > test.veg[, names(test.veg)==i] > return(tmp.out.sort) > } else { > return(tmp.out.sort) > } > } > > doesn't do what you want. Please provide a small, reproducible example > (that means with data, dummy or otherwise) so we can run the code and > test changes against your data. > > HTH > > G > >> >> >> Thanks, >> >> Aaron >> >> >> >> concov.test<-function(vegetation,specieslist) >> { >> test.veg<-vegetation >> names(test.veg)<-specieslist$LifeForm >> tmp<-matrix(nrow=nrow(test.veg),ncol=length(unique(names(test.veg)))) >> for (i in unique(names(test.veg))) >> {test.out<-apply(test.veg[,names(test.veg)==i],1,sum) >> tmp.match<-unique(names(test.veg))[unique(names(test.veg))==i] >> tmp.col<-match(tmp.match,unique(names(test.veg))) >> tmp[1:nrow(test.veg),tmp.col]<-test.out >> tmp.out<-data.frame(row.names(test.veg),tmp,row.names=1);names(tmp.out)<-unique(names(test.veg)) >> tmp.out >> tmp.out.sort<-tmp.out[,order(names(tmp.out))] >> } >> if(table(names(tmp.out))[i]==1) >> tmp.match2<-names(tmp.out.sort)[names(tmp.out.sort)==i] >> tmp.col2<-match(tmp.match2,names(tmp.out.sort)) >> tmp.out.sort[1:nrow(test.veg),tmp.col2]<-test.veg[,names(test.veg)==i] >> return(tmp.out.sort) >> else return(tmp.out.sort) >> } >> >> >> >> ----Incorrect output when run as function----- >> >> >> >>> test<-concov.test(ansveg_all,spplist.class) >>> test >> Bare_Ground Deciduous_Shrubs Deciduous_Tree Evergreen_Shrubs Evergreen_Tree >> Forbs Grasses Lichens Mosses Sedges >> ANSG_T01_01_2008 NA NA NA NA NA NA NA NA 95.0 NA >> ANSG_T01_02_2008 NA NA NA NA NA NA NA NA 16.0 NA >> ANSG_T01_03_2008 NA NA NA NA NA NA NA NA 71.0 NA >> ANSG_T01_04_2008 NA NA NA NA NA NA NA NA 10.0 NA >> ANSG_T02_01_2008 NA NA NA NA NA NA NA NA 92.2 NA >> ANSG_T02_02_2008 NA NA NA NA NA NA NA NA 14.0 NA >> >> . >> >> . >> >> . >> >> >> >> ----Correct output when code is run outside of a function---- >> >> >> >>> test.veg<-ansveg_all >>> names(test.veg)<-spplist.class$LifeForm >>> tmp<-matrix(nrow=nrow(test.veg),ncol=length(unique(names(test.veg)))) >>> >>> for (i in unique(names(test.veg))) >>> {test.out<-apply(test.veg[,names(test.veg)==i],1,sum) >> + tmp.match<-unique(names(test.veg))[unique(names(test.veg))==i] >> + tmp.col<-match(tmp.match,unique(names(test.veg))) >> + tmp[1:nrow(test.veg),tmp.col]<-test.out >> + >> tmp.out<-data.frame(row.names(test.veg),tmp,row.names=1);names(tmp.out)<-unique(names(test.veg)) >> + tmp.out >> + tmp.out.sort<-tmp.out[,order(names(tmp.out))] >> + } >>> if(table(names(tmp.out))[i]==1) >> + tmp.match2<-names(tmp.out.sort)[names(tmp.out.sort)==i] >>> tmp.col2<-match(tmp.match2,names(tmp.out.sort)) >>> tmp.out.sort[1:nrow(test.veg),tmp.col2]<-test.veg[,names(test.veg)==i] >>> return(tmp.out.sort) >>> else return(tmp.out.sort) >>> >>> >>> tmp.out.sort >> Bare_Ground Deciduous_Shrubs Deciduous_Tree Evergreen_Shrubs Evergreen_Tree >> Forbs Grasses Lichens Mosses Sedges >> ANSG_T01_01_2008 0 57.0 1.0 40.0 35.0 22.0 5.0 35.0 95.0 1.1 >> ANSG_T01_02_2008 0 0.0 0.0 0.0 0.0 34.0 0.0 0.0 16.0 24.0 >> ANSG_T01_03_2008 0 31.0 0.0 47.0 1.0 9.1 3.0 3.0 71.0 14.0 >> ANSG_T01_04_2008 0 0.0 0.0 12.0 0.0 13.2 0.0 0.0 10.0 16.0 >> ANSG_T02_01_2008 0 15.0 1.0 22.0 36.0 9.2 2.0 38.0 92.2 0.1 >> ANSG_T02_02_2008 0 33.0 66.0 23.0 2.0 5.0 0.0 3.0 14.0 0.0 >> . >> >> . >> >> . >> >> >> _________________________________________________________________ >> Rediscover Hotmail: Get quick friend updates right in your inbox. >> >> Updates2_042009 >> [[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. > -- > %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~% > Dr. Gavin Simpson [t] +44 (0)20 7679 0522 > ECRC, UCL Geography, [f] +44 (0)20 7679 0565 > Pearson Building, [e] gavin.simpsonATNOSPAMucl.ac.uk > Gower Street, London [w] http://www.ucl.ac.uk/~ucfagls/ > UK. WC1E 6BT. [w] http://www.freshwaters.org.uk > %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~% > _________________________________________________________________ Rediscover HotmailĀ®: Get quick friend updates right in your inbox. Updates2_042009 ______________________________________________ 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.