[R] some question about vector[-NULL]
PO SU
rhelpmaillist at 163.com
Thu Sep 11 11:59:42 CEST 2014
Orignally i don't want to do the if ( length) check because i know that in a 10000 loops, after may be 10 or 20 or 100 loops , "i" will not be empty.
so i mean , in the left loops, i would always check something not needed to check which i would not like to do.
--
PO SU
mail: desolator88 at 163.com
Majored in Statistics from SJTU
At 2014-09-11 05:38:12, "Duncan Murdoch" <murdoch.duncan at gmail.com> wrote:
>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: desolator88 at 163.com
>> Majored in Statistics from SJTU
>>
>>
>>
>>
>> At 2014-09-11 01:58:46, "Duncan Murdoch" <murdoch.duncan at gmail.com> 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 <rhelpmaillist at 163.com> 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: desolator88 at 163.com
>>>>> Majored in Statistics from SJTU
>>>>>
>>>>>
>>>>>
>>>>> At 2014-09-10 06:45:59, "Duncan Murdoch" <murdoch.duncan at gmail.com> 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
>>>>>>
>>>>> ______________________________________________
>>>>> 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