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: [email protected] Majored in Statistics from SJTU At 2014-09-11 05:38:12, "Duncan Murdoch" <[email protected]> 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: [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.

