[R] How to spot/stop making the same mistake

Jeff Newmiller jdnewm|| @end|ng |rom dcn@d@v|@@c@@u@
Wed Jun 23 21:51:57 CEST 2021


IMO that puts the cart before the horse. rlang implements these "operators" in very focused situations using custom expression parsing, and if they cannot tell the difference between numeric/logical and character data then rlang is broken.

That said, I do think as.logical() is more direct than !! for this purpose.

On June 23, 2021 11:27:38 AM PDT, Bill Dunlap <williamwdunlap using gmail.com> wrote:
>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 using 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 using 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 using gmail.com
>> >> <mailto:ericjberger using 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 using gmail.com <mailto:thebudget72 using 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 using r-project.org <mailto:R-help using 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 using r-project.org <mailto:R-help using 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 using 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 using 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.



More information about the R-help mailing list