On 10/09/2014, 9:53 PM, PO SU wrote:
> 
> Tks, i think using logical index is a way, but to do that, i have to keep a 
> vector as long as the original vector. that's, to exclude position 1 and 3 
> from 
> a<-1:5
> I have to let b<-c(F,T,F,T,T) and exec a[b], not a[-c(1,3)]. which c(1,3) is 
> much shorter than b if a is a long vector. that's, b would be 
> c(F,T,F,T,T,T,T,......,T)

If you know that you want to omit elements 1 and 3, then negative
integer indexing is safe.  You'll never need to explicitly type out the
whole logical vector.

The only problem with it is when you construct the indices by tests, and
sometimes nothing matches the tests, so you end up with an empty vector
or NULL.  In that case you can just as easily construct the logical
vector.

If your vectors are so long that you are worried about the cost of
constructing a logical vector that long, then it's probably worthwhile
checking the length of the integer index explicitly, i.e. instead of

a <- a[ -i ]

use

if (any(i > 0)) a <- a[ -i ]

Duncan Murdoch


> I thought a way ,
>  let d<-c(a,1) 
> that d<-c(1,2,3,4,5,1)
> and initialize the index vector   iv to length(d). that is iv<-6.
> then, d[-iv] is always equal  a[- i ] ,  whether i is NULL or not. 
> Because if i is NULL ,then iv is 6, if i is 2.then iv is c(2,6) and so 
> on.......
>  
> 
> 
> 
> 
> 
> 
> --
> 
> PO SU
> mail: [email protected] 
> Majored in Statistics from SJTU
> 
> 
> 
> 
> At 2014-09-11 01:58:46, "Duncan Murdoch" <[email protected]> wrote:
>> On 10/09/2014 12:20 PM, William Dunlap wrote:
>>> Can you make your example a bit more concrete?  E.g., is your 'index
>>> vector' A an integer vector?  If so, integer(0), an integer vector
>>> with no elements, would be a more reasonable return value than NULL,
>>> an object of class NULL with length 0, for the 'not found' case and
>>> you could check for that case by asking if length(A)==0.
>>>
>>> Show us typical inputs and expected outputs for your function (i.e.,
>>> the problem you want to solve).
>>
>> I think the problem with integer(0) and NULL is the same:  a[-i] doesn't 
>> act as expected (leaving out all the elements of i, i.e. nothing) if i 
>> is either of those.  The solution is to use logical indexing, not 
>> negative numerical indexing.
>>
>> Duncan Murdoch
>>>
>>> Bill Dunlap
>>> TIBCO Software
>>> wdunlap tibco.com
>>>
>>>
>>> On Wed, Sep 10, 2014 at 8:53 AM, PO SU <[email protected]> wrote:
>>>>
>>>> Tks for your
>>>>
>>>> a <- list(ress = 1, res = NULL)
>>>> And in my second question, let me explain it :
>>>> Actually i have two vectors in global enviroment, called A and B .A is 
>>>> initialized to NULL which used to record some index in B.
>>>> Then i would run a function F,  and each time, i would get a index value 
>>>> or NULL. that's,  D<-F(B). D would be NULL or  some index position in B.
>>>> But in the function F, though input is B,  i would exclude the index value 
>>>> from  B recorded in A. That's :
>>>> F<-function( B ) {
>>>> B<-B[-A]
>>>> some processing...
>>>> res<-NULL or some new index not included in A
>>>> return(res)
>>>> }
>>>> so in a loop,
>>>> A<-NULL
>>>> for( i in 1:100000) {
>>>> D<-F(B)
>>>> A<-c(A,D)
>>>> }
>>>> I never know whether D is a NULL or a different index  compared with 
>>>> indexes already recorded in A.
>>>> Actually, A<-c(A,D) work well, i never worry about whether D is NULL or a 
>>>> real index, but in the function F,  B<-B[-A] won't work.
>>>> so i hope that, e.g.
>>>> a<-1:3
>>>> a[-NULL] wouldn't trigger an error but return a.
>>>> Because, if i wrote function like the following:
>>>>
>>>> F<-function( B ) {
>>>> if( is.null(A))
>>>> B<-B
>>>> else
>>>> B<-B[-A]
>>>> some processing...
>>>> res<-NULL or some new index not included in A
>>>> return(res)
>>>> }
>>>> May be after 5 or 10 loops, A would already not NULL, so the added if 
>>>> ..else statement would be repeated in left  9999 loops which i would not 
>>>> like to see.
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> PO SU
>>>> mail: [email protected]
>>>> Majored in Statistics from SJTU
>>>>
>>>>
>>>>
>>>> At 2014-09-10 06:45:59, "Duncan Murdoch" <[email protected]> wrote:
>>>>> On 10/09/2014, 3:21 AM, PO SU wrote:
>>>>>>
>>>>>> Dear expeRts,
>>>>>>       I have some programming questions about NULL in R.There are listed 
>>>>>> as follows:
>>>>>> 1. I find i can't let a list have a element NULL:
>>>>>> a<-list()
>>>>>> a$ress<-1
>>>>>> a$res<-NULL
>>>>>> a
>>>>>> str(a)
>>>>>
>>>>> You can do it using
>>>>>
>>>>> a <- list(ress = 1, res = NULL)
>>>>>
>>>>>> How can i know i have a named element but it is NULL, not just get 
>>>>>> a$xxxx,a$iiii,a$oooo there all get NULL
>>>>>
>>>>> That's a little harder.  There are a few ways:
>>>>>
>>>>> "res" %in% names(a) & is.null(a[["res"]])
>>>>>
>>>>> or
>>>>>
>>>>> identical(a["res"], list(res = NULL))
>>>>>
>>>>> or
>>>>>
>>>>> is.null(a[[2]])
>>>>>
>>>>> should all work.
>>>>>
>>>>> Generally because of the special handling needed, it's a bad idea to try
>>>>> to store NULL in a list.
>>>>>
>>>>>> 2.The most important thing:
>>>>>> a<-1:10
>>>>>> b<-NULL or 1
>>>>>> a<-c(a,b) will work so i don't need to know whether b is null or not,but:
>>>>>> a[-NULL] can't work!!  i just need a[-NULL]==a , how can i reach this 
>>>>>> purpose?
>>>>>
>>>>> Using !, and a logical test, e.g.
>>>>>
>>>>> a[!nullentry(a)]
>>>>>
>>>>> where nullentry() is a function based on one of the tests above, but
>>>>> applied to all entries.
>>>>>
>>>>> Duncan Murdoch
>>>>>
>>>> ______________________________________________
>>>> [email protected] 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.
>>

______________________________________________
[email protected] 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.

Reply via email to