[R] dynamically extract data from a list

Dries Knapen dries.knapen at gmail.com
Tue Aug 12 16:35:29 CEST 2008


Hi,

Thanks for your reply. However, this didn't work exactly as I needed  
it to since the expression is dynamically built as a character vector

i.e. not executed as
e <- expression(Sepal.Width > 4)

but as
e <- expression("Sepal.Width > 4")

in which case subset() throws an error (must evaluate to logical).

Fortunately, a good night of sleep resulted in this workaround:

s <- "iris[Sepal.Width > 4,]"
execute.string <- function(string) {
   write(string, 'tmp.txt')
   out <- source('tmp.txt')
   unlink('tmp.txt')
   return(out$value)
}
execute.string(s)


On 12 Aug 2008, at 04:08, Gabor Grothendieck wrote:

> Try this:
>
>> e <- expression(Sepal.Width > 4)
>> subset(iris, eval(e), select = "Sepal.Length")
>    Sepal.Length
> 16          5.7
> 33          5.2
> 34          5.5
>> subset(iris, eval(e))
>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
> 16          5.7         4.4          1.5         0.4  setosa
> 33          5.2         4.1          1.5         0.1  setosa
> 34          5.5         4.2          1.4         0.2  setosa
>
>
> On Mon, Aug 11, 2008 at 9:36 PM, Dries Knapen  
> <dries.knapen at gmail.com> wrote:
>> Hi,
>>
>> Based on user input, I wrote a function that creates a list which  
>> looks
>> like:
>>
>>> str(list)
>> List of 4
>>  $ varieties: chr [1:12] "temp.26_time.5dagen_biorep.1"
>> "time.5dagen_temp.26_biorep.2" "temp.18_time.5dagen_biorep.1"
>> "temp.18_time.5dagen_biorep.2" ...
>>  $ temp     : Factor w/ 2 levels "18","26": 2 2 1 1 2 2 1 1 1 1 ...
>>  $ time     : Factor w/ 3 levels "14dagen","28dagen",..: 3 3 3 3 1  
>> 1 1 1 2 2
>> ...
>>  $ biorep   : Factor w/ 2 levels "1","2": 1 2 1 2 1 2 1 2 1 2 ...
>>
>> Now, based on user input as well, I want to dynamically extract  
>> data from
>> list$varieties. Therefore, I wrote a function which generates a  
>> string
>> containing the data extraction conditions which looks like this:
>>
>>> query <- make.contrast.substring(negative.contrast, list)
>> Read 1 item
>> [1]
>> "(list$temp=='18')&(list$time=='14dagen'|list$time=='28dagen'|list 
>> $time=='5dagen')&(list$biorep=='1'|list$biorep=='2')"
>>
>> Now what I want to achieve is to extract data by doing:
>>
>> list$varieties[query]
>>
>> which doesn't work since "query" is a string and object names are not
>> expanded...
>>
>> Obviously, manually copying the string like so
>>
>> list$varieties[(list$temp=='18')&(list$time=='14dagen'|list 
>> $time=='28dagen'|list$time=='5dagen')&(list$biorep=='1'|list 
>> $biorep=='2')]
>>
>> works perfectly - but I need it to be automated.
>>
>> I'm quite new to R and used to programming in PHP, so I may just be
>> "conceptually" confused about how to do this. Any help would be  
>> greatly
>> appreciated.
>>
>> thanks in advance,
>> Dries Knapen
>>
>>
>>
>> ********************************************
>> Dr. Dries Knapen
>>
>> University of Antwerp
>> Department of Biology
>> Ecophysiology, Biochemistry and Toxicology
>> Groenenborgerlaan 171 - U711, B-2020 Antwerp
>> Belgium
>>
>> tel ++32 3 265 33 49
>> fax ++32 3 265 34 97
>>
>> ______________________________________________
>> 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.



More information about the R-help mailing list