For the record, `!!` is not an operator so it does not "operate" on anything. The right ! does per the help page (?`!`) interpret non-zero values as TRUE and invert that logic, yielding a logical result even if the input is not logical. The left ! inverts that again, yielding a logical vector without the inversion. On June 23, 2021 10:39:07 AM PDT, Phillips Rogfield <thebudget72 at gmail.com> wrote:>Dear all, > >thank for for your suggestion. > >Yes I come from languages where 1 means TRUE and 0 means FALSE. In >particular from C/C++ and Python. > >Evidently this is not the case for R. > >In my mind I kind took for granted that that was the case (1=TRUE, >0=FALSE). > >Knowing this is not the case for R makes things simpler. > >Mine was just an example, sometimes I load datasets taken from outside >and variables are coded with 1/0 (for example, a treatment variable may > >be coded that way). > >I also did not know the !!() syntax! > >Thank you for your help and best regards. > >On 23/06/2021 17:55, Bert Gunter wrote: >> Just as a way to save a bit of typing, instead of >> >> > as.logical(0:4) >> [1] FALSE ?TRUE ?TRUE ?TRUE ?TRUE >> >> > !!(0:4) >> [1] FALSE ?TRUE ?TRUE ?TRUE ?TRUE >> >> DO NOTE that the parentheses in the second expression should never be > >> omitted, a possible reason to prefer the as.logical() construction. >> Also note that !!? "acts [only] on raw, logical and number-like >> vectors," whereas as.logical() is more general. e.g. (from ?logical): >> >> > charvec <- c("FALSE", "F", "False", "false", ? ?"fAlse", "0", >> + ? ? ? ? ? ? ?"TRUE", ?"T", "True", ?"true", ? ? "tRue", ?"1") >> > as.logical(charvec) >> ?[1] FALSE FALSE FALSE FALSE ? ?NA ? ?NA ?TRUE ?TRUE ?TRUE ?TRUE ? >?NA >> ? ?NA >> > !!charvec >> Error in !charvec : invalid argument type >> >> >> Cheers, >> Bert >> >> Bert Gunter >> >> "The trouble with having an open mind is that people keep coming >along >> and sticking things into it." >> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) >> >> >> On Wed, Jun 23, 2021 at 8:31 AM Eric Berger <ericjberger at gmail.com >> <mailto:ericjberger at gmail.com>> wrote: >> >> In my code, instead of 't', I name a vector of indices with a >> meaningful >> name, such as idxV, to make it obvious. >> >> Alternatively, a minor change in your style would be to replace >your >> definition of t by >> >> t <- as.logical(c(1,1,1,0,0)) >> >> HTH, >> Eric >> >> >> On Wed, Jun 23, 2021 at 6:11 PM Phillips Rogfield >> <thebudget72 at gmail.com <mailto:thebudget72 at gmail.com>> >> wrote: >> >> > I make the same mistake all over again. >> > >> > In particular, suppose we have: >> > >> > a = c(1,2,3,4,5) >> > >> > and a variable that equals 1 for the elements I want to select: >> > >> > t = c(1,1,1,0,0) >> > >> > To select the first 3 elements. >> > >> > The problem is that >> > >> > a[t] >> > >> > would repeat the first element 3 times ..... >> > >> > I have to either convert `t` to boolean: >> > >> > a[t==1] >> > >> > Or use `which` >> > >> > a[which(t==1)] >> > >> > How can I "spot" this error? >> > >> > It often happens in long scripts. >> > >> > Do I have to check the type each time? >> > >> > Do you have any suggestions? >> > >> > ______________________________________________ >> > R-help at r-project.org <mailto:R-help at r-project.org> mailing list >> -- To UNSUBSCRIBE and more, see >> > https://stat.ethz.ch/mailman/listinfo/r-help >> <https://stat.ethz.ch/mailman/listinfo/r-help> >> > PLEASE do read the posting guide >> > http://www.R-project.org/posting-guide.html >> <http://www.R-project.org/posting-guide.html> >> > and provide commented, minimal, self-contained, reproducible >code. >> > >> >> ? ? ? ? [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at r-project.org <mailto:R-help at r-project.org> mailing list >-- >> To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> <https://stat.ethz.ch/mailman/listinfo/r-help> >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> <http://www.R-project.org/posting-guide.html> >> and provide commented, minimal, self-contained, reproducible >code. >> > > [[alternative HTML version deleted]] > >______________________________________________ >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >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.-- Sent from my phone. Please excuse my brevity.
Note that !! and !!! are special operators involving "quasiquotation" in the dplyr package. I would use as.logical(x) instead of !!x since its meaning is clear to any user. -Bill On Wed, Jun 23, 2021 at 11:13 AM Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote:> For the record, `!!` is not an operator so it does not "operate" on > anything. The right ! does per the help page (?`!`) interpret non-zero > values as TRUE and invert that logic, yielding a logical result even if the > input is not logical. The left ! inverts that again, yielding a logical > vector without the inversion. > > On June 23, 2021 10:39:07 AM PDT, Phillips Rogfield <thebudget72 at gmail.com> > wrote: > >Dear all, > > > >thank for for your suggestion. > > > >Yes I come from languages where 1 means TRUE and 0 means FALSE. In > >particular from C/C++ and Python. > > > >Evidently this is not the case for R. > > > >In my mind I kind took for granted that that was the case (1=TRUE, > >0=FALSE). > > > >Knowing this is not the case for R makes things simpler. > > > >Mine was just an example, sometimes I load datasets taken from outside > >and variables are coded with 1/0 (for example, a treatment variable may > > > >be coded that way). > > > >I also did not know the !!() syntax! > > > >Thank you for your help and best regards. > > > >On 23/06/2021 17:55, Bert Gunter wrote: > >> Just as a way to save a bit of typing, instead of > >> > >> > as.logical(0:4) > >> [1] FALSE TRUE TRUE TRUE TRUE > >> > >> > !!(0:4) > >> [1] FALSE TRUE TRUE TRUE TRUE > >> > >> DO NOTE that the parentheses in the second expression should never be > > > >> omitted, a possible reason to prefer the as.logical() construction. > >> Also note that !! "acts [only] on raw, logical and number-like > >> vectors," whereas as.logical() is more general. e.g. (from ?logical): > >> > >> > charvec <- c("FALSE", "F", "False", "false", "fAlse", "0", > >> + "TRUE", "T", "True", "true", "tRue", "1") > >> > as.logical(charvec) > >> [1] FALSE FALSE FALSE FALSE NA NA TRUE TRUE TRUE TRUE > > NA > >> NA > >> > !!charvec > >> Error in !charvec : invalid argument type > >> > >> > >> Cheers, > >> Bert > >> > >> Bert Gunter > >> > >> "The trouble with having an open mind is that people keep coming > >along > >> and sticking things into it." > >> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > >> > >> > >> On Wed, Jun 23, 2021 at 8:31 AM Eric Berger <ericjberger at gmail.com > >> <mailto:ericjberger at gmail.com>> wrote: > >> > >> In my code, instead of 't', I name a vector of indices with a > >> meaningful > >> name, such as idxV, to make it obvious. > >> > >> Alternatively, a minor change in your style would be to replace > >your > >> definition of t by > >> > >> t <- as.logical(c(1,1,1,0,0)) > >> > >> HTH, > >> Eric > >> > >> > >> On Wed, Jun 23, 2021 at 6:11 PM Phillips Rogfield > >> <thebudget72 at gmail.com <mailto:thebudget72 at gmail.com>> > >> wrote: > >> > >> > I make the same mistake all over again. > >> > > >> > In particular, suppose we have: > >> > > >> > a = c(1,2,3,4,5) > >> > > >> > and a variable that equals 1 for the elements I want to select: > >> > > >> > t = c(1,1,1,0,0) > >> > > >> > To select the first 3 elements. > >> > > >> > The problem is that > >> > > >> > a[t] > >> > > >> > would repeat the first element 3 times ..... > >> > > >> > I have to either convert `t` to boolean: > >> > > >> > a[t==1] > >> > > >> > Or use `which` > >> > > >> > a[which(t==1)] > >> > > >> > How can I "spot" this error? > >> > > >> > It often happens in long scripts. > >> > > >> > Do I have to check the type each time? > >> > > >> > Do you have any suggestions? > >> > > >> > ______________________________________________ > >> > R-help at r-project.org <mailto:R-help at r-project.org> mailing list > >> -- To UNSUBSCRIBE and more, see > >> > https://stat.ethz.ch/mailman/listinfo/r-help > >> <https://stat.ethz.ch/mailman/listinfo/r-help> > >> > PLEASE do read the posting guide > >> > http://www.R-project.org/posting-guide.html > >> <http://www.R-project.org/posting-guide.html> > >> > and provide commented, minimal, self-contained, reproducible > >code. > >> > > >> > >> [[alternative HTML version deleted]] > >> > >> ______________________________________________ > >> R-help at r-project.org <mailto:R-help at r-project.org> mailing list > >-- > >> To UNSUBSCRIBE and more, see > >> https://stat.ethz.ch/mailman/listinfo/r-help > >> <https://stat.ethz.ch/mailman/listinfo/r-help> > >> PLEASE do read the posting guide > >> http://www.R-project.org/posting-guide.html > >> <http://www.R-project.org/posting-guide.html> > >> and provide commented, minimal, self-contained, reproducible > >code. > >> > > > > [[alternative HTML version deleted]] > > > >______________________________________________ > >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >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. > > -- > Sent from my phone. Please excuse my brevity. > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. >[[alternative HTML version deleted]]
Just a caution. There IS an operator of `!!` in the tidyverse called "bang bang" that does a kind of substitution and you can look up the help page for it as: ?`!!` I just tried it on an example and it definitely will in some cases do this other evaluation. I doubt this will clash, but of course parentheses can force the normal evaluation as in !(!(a)) And there is a !!! symbol there too to make a big bang, theoretically. But not for novices ? -----Original Message----- From: R-help <r-help-bounces at r-project.org> On Behalf Of Jeff Newmiller Sent: Wednesday, June 23, 2021 2:10 PM To: r-help at r-project.org; Phillips Rogfield <thebudget72 at gmail.com>; Bert Gunter <bgunter.4567 at gmail.com>; Eric Berger <ericjberger at gmail.com> Cc: r-help at r-project.org Subject: Re: [R] How to spot/stop making the same mistake For the record, `!!` is not an operator so it does not "operate" on anything. The right ! does per the help page (?`!`) interpret non-zero values as TRUE and invert that logic, yielding a logical result even if the input is not logical. The left ! inverts that again, yielding a logical vector without the inversion. On June 23, 2021 10:39:07 AM PDT, Phillips Rogfield <thebudget72 at gmail.com> wrote:>Dear all, > >thank for for your suggestion. > >Yes I come from languages where 1 means TRUE and 0 means FALSE. In >particular from C/C++ and Python. > >Evidently this is not the case for R. > >In my mind I kind took for granted that that was the case (1=TRUE, >0=FALSE). > >Knowing this is not the case for R makes things simpler. > >Mine was just an example, sometimes I load datasets taken from outside >and variables are coded with 1/0 (for example, a treatment variable may > >be coded that way). > >I also did not know the !!() syntax! > >Thank you for your help and best regards. > >On 23/06/2021 17:55, Bert Gunter wrote: >> Just as a way to save a bit of typing, instead of >> >> > as.logical(0:4) >> [1] FALSE TRUE TRUE TRUE TRUE >> >> > !!(0:4) >> [1] FALSE TRUE TRUE TRUE TRUE >> >> DO NOTE that the parentheses in the second expression should never be > >> omitted, a possible reason to prefer the as.logical() construction. >> Also note that !! "acts [only] on raw, logical and number-like >> vectors," whereas as.logical() is more general. e.g. (from ?logical): >> >> > charvec <- c("FALSE", "F", "False", "false", "fAlse", "0", >> + "TRUE", "T", "True", "true", "tRue", "1") >> > as.logical(charvec) >> [1] FALSE FALSE FALSE FALSE NA NA TRUE TRUE TRUE TRUE > NA >> NA >> > !!charvec >> Error in !charvec : invalid argument type >> >> >> Cheers, >> Bert >> >> Bert Gunter >> >> "The trouble with having an open mind is that people keep coming >along >> and sticking things into it." >> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) >> >> >> On Wed, Jun 23, 2021 at 8:31 AM Eric Berger <ericjberger at gmail.com >> <mailto:ericjberger at gmail.com>> wrote: >> >> In my code, instead of 't', I name a vector of indices with a >> meaningful >> name, such as idxV, to make it obvious. >> >> Alternatively, a minor change in your style would be to replace >your >> definition of t by >> >> t <- as.logical(c(1,1,1,0,0)) >> >> HTH, >> Eric >> >> >> On Wed, Jun 23, 2021 at 6:11 PM Phillips Rogfield >> <thebudget72 at gmail.com <mailto:thebudget72 at gmail.com>> >> wrote: >> >> > I make the same mistake all over again. >> > >> > In particular, suppose we have: >> > >> > a = c(1,2,3,4,5) >> > >> > and a variable that equals 1 for the elements I want to select: >> > >> > t = c(1,1,1,0,0) >> > >> > To select the first 3 elements. >> > >> > The problem is that >> > >> > a[t] >> > >> > would repeat the first element 3 times ..... >> > >> > I have to either convert `t` to boolean: >> > >> > a[t==1] >> > >> > Or use `which` >> > >> > a[which(t==1)] >> > >> > How can I "spot" this error? >> > >> > It often happens in long scripts. >> > >> > Do I have to check the type each time? >> > >> > Do you have any suggestions? >> > >> > ______________________________________________ >> > R-help at r-project.org <mailto:R-help at r-project.org> mailing list >> -- To UNSUBSCRIBE and more, see >> > https://stat.ethz.ch/mailman/listinfo/r-help >> <https://stat.ethz.ch/mailman/listinfo/r-help> >> > PLEASE do read the posting guide >> > http://www.R-project.org/posting-guide.html >> <http://www.R-project.org/posting-guide.html> >> > and provide commented, minimal, self-contained, reproducible >code. >> > >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at r-project.org <mailto:R-help at r-project.org> mailing list >-- >> To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> <https://stat.ethz.ch/mailman/listinfo/r-help> >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> <http://www.R-project.org/posting-guide.html> >> and provide commented, minimal, self-contained, reproducible >code. >> > > [[alternative HTML version deleted]] > >______________________________________________ >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >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.-- Sent from my phone. Please excuse my brevity. ______________________________________________ R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.