On Dec 20, 2012, at 10:01 AM, Jessica Streicher wrote: > Really must have been unclear at some point, sorry.
Hasn't it become abundantly clear that this would have progress farther had you post a complete example? -- David. > > William, thats interesting, but not really helping the main problem, which > is: how to do > >> l[[ as.character(grid[1, ]) ]] <- 1 > > without having initialized the list in the loop before. > > Well, or how to initialize it without having to do the loop thing, because > the loop stuff can only be done for a specific set of parameter vectors. But > those change, and i don't want to have to write another loop construct every > time for the new version. > > I want to say: hey, i have these vectors here with these values (my > parameters), could you build me that nested list structure (tree - whatever) > from it? And the function will give me that structure whatever i give it > without me needing to intervene in form of changing the code. > > -------------- Clarification ----------------- > > First: i am not computing statistics over the parameters. I'm computing stuff > from other data, and the computation is affected by the parameters. > > I am computing classifiers for different sets of parameters for those > classifiers. So the result of doSomething() isn't a simple value. Its usually > a list of 6 lists (doing cross validation), which in turn have the classifier > object, some statistics of the classifier (e.g what was missclassified), and > the subsets of data used in them. > That doesn't really fit in a data.frame, hence the use of lists. I want the > nested lists because it helps me find stuff in the object browser faster, and > because all my other code is already geared towards it. If i had the time i > might still go for a flat structure that everyone keeps telling me to use > (got a few mails off the list), > but i really haven't the time. > > If theres no good way i'll just keep things as they are now. > > > On 20.12.2012, at 18:37, William Dunlap wrote: > >> Arranging data as a list of lists of lists of lists [...] of scalar values >> generally >> will lead to slow and hard-to-read R code, mainly because R is designed to >> work on long vectors of simple data. If you were to start over, consider >> constructing >> a data.frame with one column for each attribute. Then tools like aggregate >> and >> the plyr functions would be useful. >> >> However, your immediate problem may be solved by creating your 'grid' object >> as a data.frame of character, not factor, columns because as.character works >> differently >> on lists of scalar factors and lists of scalar characters. Usually >> as.<mode>(x), when >> x is a list of length-1 items, gives the same result as >> as.<mode>(unlist(x)), but not when >> x is a list of length-1 factors: >> >>> height<-c("high", "low") >>> width<-c("slim", "wide") >>> gridF <- expand.grid(height, width, stringsAsFactors=FALSE) >>> gridT <- expand.grid(height, width, stringsAsFactors=TRUE) >>> as.character(gridF[1,]) >> [1] "high" "slim" >>> as.character(gridT[1,]) >> [1] "1" "1" >>> as.character(unlist(gridT[1,])) # another workaround >> [1] "high" "slim" >> >> Your example was not self-contained so I changed the call to doSomething() >> to paste(h,w,sep="/"): >> >> height<-c("high", "low") >> width<-c("slim", "wide") >> >> l <- list() >> for(h in height){ >> l[[h]] <- list() >> for(w in width){ >> l[[h]][[w]] <- paste(h, w, sep="/") # doSomething() >> } >> } >> >> grid <- expand.grid(height, width, stringsAsFactors=FALSE) >> as.character(grid[1,]) >> # [1] "high" "slim", not the [1] "1" "1" you get with stringsAsFactors=TRUE >> l[[ as.character(grid[1, ]) ]] >> # [1] "high/slim" >> l[[ as.character(grid[1, ]) ]] <- 1 >> l[[ as.character(grid[1, ]) ]] >> # [1] 1 >> >> Bill Dunlap >> Spotfire, TIBCO Software >> wdunlap tibco.com >> >>> -----Original Message----- >>> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On >>> Behalf >>> Of Jessica Streicher >>> Sent: Thursday, December 20, 2012 8:43 AM >>> To: Chris Campbell >>> Cc: R help >>> Subject: Re: [R] Filling Lists or Arrays of variable dimensions >>> >>> Aggregate is highly confusing (and i would have appreciated if you used my >>> example >>> instead, i don't get it to do anything sensible on my stuff). >>> >>> And this seems not what i asked for anyway. This may be a named list but >>> not named and >>> structured as i want it at all. >>> >>> happy Christmas too >>> >>> On 20.12.2012, at 15:48, Chris Campbell wrote: >>> >>>> Dear Jessica >>>> >>>> Aggregate is a function that allows you to perform loops across multiple >>>> variables. >>>> >>>> tempData <- data.frame(height = rnorm(20, 100, 10), >>>> width = rnorm(20, 50, 5), >>>> par1 = rnorm(20)) >>>> >>>> tempData$htfac <- cut(tempData$height, c(0, 100, 200)) >>>> tempData$wdfac <- cut(tempData$width, c(0, 50, 100)) >>>> >>>> doSomething <- function(x) { mean(x) } >>>> >>>> out <- aggregate(tempData["par1"], tempData[c("htfac", "wdfac")], >>>> doSomething) >>>> >>>> # out is a data frame; this is a named list. >>>> # use as.list to remove the data.frame class >>>> >>>>> as.list(out) >>>> >>>> $htfac >>>> [1] (0,100] (100,200] (0,100] (100,200] >>>> Levels: (0,100] (100,200] >>>> >>>> $wdfac >>>> [1] (0,50] (0,50] (50,100] (50,100] >>>> Levels: (0,50] (50,100] >>>> >>>> $par1 >>>> [1] -1.0449563 -0.3782483 -0.9319105 0.8837459 >>>> >>>> >>> >>>> >>>> I believe you are seeing an error similar to this one: >>>> >>>>> out[[1:3]] <- 1 >>>> Error in `[[<-`(`*tmp*`, i, value = value) : >>>> recursive indexing failed at level 2 >>>> >>>> This is because double square brackets for lists can only set a single >>>> list element at >>> once; grid[1, ] is longer. >>> >>>> >>>> Happy Christmas >>>> >>>> Chris >>>> >>>> >>>> Chris Campbell >>>> Tel. +44 (0) 1249 705 450 | Mobile. +44 (0) 7929 628 349 >>>> mailto:ccampb...@mango-solutions.com | http://www.mango-solutions.com >>>> Mango Solutions >>>> 2 Methuen Park >>>> Chippenham >>>> Wiltshire >>>> SN14 OGB >>>> UK >>>> >>>> -----Original Message----- >>>> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] >>>> On Behalf >>> Of Jessica Streicher >>>> Sent: 20 December 2012 12:46 >>>> To: R help >>>> Subject: [R] Filling Lists or Arrays of variable dimensions >>>> >>>> Following problem: >>>> >>>> Say you have a bunch of parameters and want to produce results for all >>>> combinations >>> of those: >>>> >>>> height<-c("high","low") >>>> width<-c("slim","wide") >>>> >>>> then what i used to do was something like this: >>>> >>>> l<-list() >>>> for(h in height){ >>>> l[[h]]<-list() >>>> for(w in width){ >>>> l[[h]][[w]] <- doSomething() >>>> } >>>> } >>>> >>>> Now those parameters aren't always the same. Their number can change and >>>> the >>> number of entries can change, and i'd like to have one code that can handle >>> all >>> configurations. >>>> >>>> Now i thought i could use expand.grid() to get all configurations ,and >>>> than iterate over >>> the rows, but the problem then is that i cannot set the values in the list >>> like above. >>>> >>>> grid<-expand.grid(height,width) >>>> l[[as.character(grid[1,])]] <-1 >>>> Error in `[[<-`(`*tmp*`, as.character(grid[1, ]), value = 1) : >>>> no such index at level 1 >>>> >>>> This will only work if the "path" for that is already existent, and i'm >>>> not sure how to >>> build that in this scenario. >>>> >>>> I then went on and built an array instead lists of lists, but that doesn't >>>> help either >>> because i can't access the array with what i have in the grids row - or at >>> least i don't >>> know how. >>>> >>>> Any ideas? >>>> >>>> I'd prefer to keep the named lists since all other code is built towards >>>> this. >>>> ______________________________________________ >>>> 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. >>>> >>>> -- >>>> >>>> LEGAL NOTICE >>>> >>>> This message is intended for the use of the named recipient(s) only and >>>> may contain >>>> confidential and / or privileged information. If you are not the intended >>>> recipient, >>> please >>>> contact the sender and delete this message. Any unauthorised use of the >>>> information >>>> contained in this message is prohibited. >>>> >>>> Mango Business Solutions Limited is registered in England under No. >>>> 4560258 with its >>>> registered office at Suite 3, Middlesex House, Rutherford Close, >>>> Stevenage, Herts, SG1 >>> 2EF, >>>> UK. >>>> >>>> PLEASE CONSIDER THE ENVIRONMENT BEFORE PRINTING THIS EMAIL >>>> >>> >>> ______________________________________________ >>> 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. > > ______________________________________________ > 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. David Winsemius Alameda, CA, USA ______________________________________________ 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.