I like phead/ptail. I was going to write them, so thanks for taking care of
it!

Michael



On Tue, Apr 1, 2014 at 3:24 PM, Hervé Pagès <hpa...@fhcrc.org> wrote:

> On 04/01/2014 02:43 PM, Michael Lawrence wrote:
>
>> Thanks Herve. I might not be so bad to have rep out in the unnamed case
>> (think of NULL names meaning wildcard). If we had:
>>
>> i <- IntegerList(1:5)
>> x[i]
>>
>> The 'i' does not really identify any one element in 'x'. If both 'i' and
>> 'x' had names, then there would be a matching, but otherwise, truncating
>> 'x' to length(i) is surprising, and it's hard to imagine a use-case for
>> it. In some ways, this is analogous to logical indexing, which is
>> recycled.
>>
>> But that said, my use case is really more of a pluckHead/Tail. Don't
>> worry about this release.
>>
>
> The pseq_len() utility I sent previously solves your pluckHead()
> problem:
>
>   pluckHead <- function(x, n=6)
>   {
>     x[pseq_len(pmin(elementLengths(x), n))]
>   }
>
> or, using the non-exported utility IRanges:::fancy_mseq():
>
>   pluckHead <- function(x, n=6)
>   {
>     x_eltlens <- unname(elementLengths(x))
>     i_eltlens <- pmin(x_eltlens, n)
>     i_skeleton <- PartitioningByEnd(cumsum(i_eltlens), names=names(x))
>     unlisted_i <- IRanges:::fancy_mseq(i_eltlens)
>     i <- relist(unlisted_i, i_skeleton)
>     x[i]
>   }
>
> For pluckTail():
>
>   pluckTail <- function(x, n=6)
>   {
>     x_eltlens <- unname(elementLengths(x))
>     i_eltlens <- pmin(x_eltlens, n)
>     i_skeleton <- PartitioningByEnd(cumsum(i_eltlens), names=names(x))
>     offset <- x_eltlens - i_eltlens
>     unlisted_i <- IRanges:::fancy_mseq(i_eltlens, offset)
>     i <- relist(unlisted_i, i_skeleton)
>     x[i]
>   }
>
> For both, 'n' can be of length > 1 and is recycled to the length of 'x'.
> Negative values in 'n' are not supported but that should be easy to
> add.
>
> So I could add these 2 functions to IRanges, however, I'm not totally
> convinced by the names. What about phead() and ptail() ("p" for
> "parallel"), or vhead() and vtail() ("v" for "vectorized"), or mhead()
> and mtail() (they're just fast equivalent to 'mapply(head, x, n)' and
> 'mapply(tail, x, n))', or...?
>
> Thanks,
> H.
>
>
>> Michael
>>
>>
>>
>> On Tue, Apr 1, 2014 at 12:06 PM, Hervé Pagès <hpa...@fhcrc.org
>> <mailto:hpa...@fhcrc.org>> wrote:
>>
>>     On 04/01/2014 10:17 AM, Ryan wrote:
>>
>>         That won't work if any vector has fewer than 5 elements. Maybe
>>
>>         lapply(x, head, n=5)
>>
>>         would work?
>>
>>
>>     Yes. Note that you can use endoapply() to preserve the class of the
>>     original object:
>>
>>        > endoapply(cvg, head, n=5)
>>
>>        RleList of length 3
>>        $chr1
>>        integer-Rle of length 5 with 2 runs
>>          Lengths: 4 1
>>          Values : 1 2
>>
>>
>>        $chr2
>>        integer-Rle of length 5 with 4 runs
>>          Lengths: 1 1 1 2
>>          Values : 0 1 2 3
>>
>>        $chr3
>>        integer-Rle of length 5 with 1 run
>>          Lengths: 5
>>          Values : 0
>>
>>     But lapply- or endoapply-based solutions are slower than a [ based
>>     solution. Unfortunately the latter requires too much munging to get
>>     the subscript right:
>>
>>        ## parallel seq_len()
>>        pseq_len <- function(eltlens)
>>        {
>>          ans_skeleton <- PartitioningByWidth(eltlens)
>>          tmp <- relist(seq_len(sum(eltlens)), ans_skeleton)
>>          tmp - start(ans_skeleton) + 1L
>>        }
>>
>>     Then:
>>
>>        > pseq_len(c(5, 1, 0, 2))
>>        IntegerList of length 4
>>        [[1]] 1 2 3 4 5
>>        [[2]] 1
>>        [[3]] integer(0)
>>        [[4]] 1 2
>>
>>        > cvg[pseq_len(pmin(__elementLengths(cvg), 5))]
>>
>>
>>        RleList of length 3
>>        $chr1
>>        integer-Rle of length 5 with 2 runs
>>          Lengths: 4 1
>>          Values : 1 2
>>
>>
>>        $chr2
>>        integer-Rle of length 5 with 4 runs
>>          Lengths: 1 1 1 2
>>          Values : 0 1 2 3
>>
>>        $chr3
>>        integer-Rle of length 5 with 1 run
>>          Lengths: 5
>>          Values : 0
>>
>>     H.
>>
>>
>>
>>         On Tue Apr  1 09:24:51 2014, Cook, Malcolm wrote:
>>
>>             in the mean time,
>>
>>             lapply(`[`,x,IntegerList(1:5))
>>
>>             ??
>>
>>                >-----Original Message-----
>>                >From: bioc-devel-bounces@r-project.__org
>>             <mailto:bioc-devel-boun...@r-project.org>
>>             [mailto:bioc-devel-bounces@r-__project.org
>>             <mailto:bioc-devel-boun...@r-project.org>] On Behalf Of
>>             Michael Lawrence
>>                >Sent: Tuesday, April 01, 2014 9:21 AM
>>                >To: bioc-devel@r-project.org
>>             <mailto:bioc-devel@r-project.org>
>>                >Subject: [Bioc-devel] Subsetting Lists by Lists
>>                >
>>                >Mostly to Herve:
>>                >
>>                >Sometimes we want to pluck the first 1, or 10, or
>>             whatever elements
>>             from
>>                >each element of a list. If I had a list 'x', I thought I
>>             could do
>>             this with:
>>                >
>>                >x[IntegerList(1:5)]
>>                >
>>                >But it only gives elements 1:5 from x[[1]], not each
>>             element of
>>             'x'. In
>>                >other words, I thought the index would be repped out.
>>             Instead, 'x' is
>>                >subset to the length of 'i', and I'm not sure if that
>>             makes sense?
>>                >
>>                >But maybe what we really want are pluckHead/Tail, which
>>             would be
>>             robust to
>>                >the case that < n elements are in an element. And of
>>             course a more
>>             general
>>                >pluck(x, i) to select 'i' from each element, but I
>>             wanted the line
>>             above to
>>                >do that.
>>                >
>>                >Michael
>>                >
>>                >    [[alternative HTML version deleted]]
>>                >
>>                >_________________________________________________
>>                >Bioc-devel@r-project.org
>>             <mailto:Bioc-devel@r-project.org> mailing list
>>                >https://stat.ethz.ch/mailman/__listinfo/bioc-devel
>>             <https://stat.ethz.ch/mailman/listinfo/bioc-devel>
>>
>>             _________________________________________________
>>             Bioc-devel@r-project.org <mailto:Bioc-devel@r-project.org>
>>             mailing list
>>             https://stat.ethz.ch/mailman/__listinfo/bioc-devel
>>             <https://stat.ethz.ch/mailman/listinfo/bioc-devel>
>>
>>
>>         _________________________________________________
>>         Bioc-devel@r-project.org <mailto:Bioc-devel@r-project.org>
>>         mailing list
>>         https://stat.ethz.ch/mailman/__listinfo/bioc-devel
>>
>>         <https://stat.ethz.ch/mailman/listinfo/bioc-devel>
>>
>>
>>     --
>>     Hervé Pagès
>>
>>     Program in Computational Biology
>>     Division of Public Health Sciences
>>     Fred Hutchinson Cancer Research Center
>>     1100 Fairview Ave. N, M1-B514
>>     P.O. Box 19024
>>     Seattle, WA 98109-1024
>>
>>     E-mail: hpa...@fhcrc.org <mailto:hpa...@fhcrc.org>
>>     Phone: (206) 667-5791 <tel:%28206%29%20667-5791>
>>     Fax: (206) 667-1319 <tel:%28206%29%20667-1319>
>>
>>
>>
> --
> Hervé Pagès
>
> Program in Computational Biology
> Division of Public Health Sciences
> Fred Hutchinson Cancer Research Center
> 1100 Fairview Ave. N, M1-B514
> P.O. Box 19024
> Seattle, WA 98109-1024
>
> E-mail: hpa...@fhcrc.org
> Phone:  (206) 667-5791
> Fax:    (206) 667-1319
>

        [[alternative HTML version deleted]]

_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel

Reply via email to