Beware of the is.* functions: * is.object() does not test the usual definition of objects * is.vector() does not test the usual definition of vectors * is.numeric() does not work the same way as is.character() or is.integer() * is.Date() doesn't exist * is.nan() doesn't return TRUE for some NaNs
Hadley On Fri, May 9, 2014 at 4:32 PM, Spencer Graves <spencer.gra...@structuremonitoring.com> wrote: > Hi, Duncan: > > > Thanks very much. I used to think that everything in R was a object. > Now I know that is.object(quote(x)) is FALSE. (A decade ago, S-Plus asked > me if I wanted to save changes to history. I thought, "Wow! Do I get to > change history?" > > > Hadley's "Advanced R" book mentions "Reference classes" in his "OO > field guide". It includes an example where changing "a" changes a "copy" > previously made: > > > b <- a > b$balance > #> [1] 200 > a$balance <- 0 > b$balance > #> [1] 0 > > > This bothers me far more than an object in R that's not an object ;-) > > > Best Wishes, > Spencer > > > > On 5/9/2014 6:48 AM, Bert Gunter wrote: >> >> Ahhh. Thanks Duncan. >> >> -- Bert >> >> Bert Gunter >> Genentech Nonclinical Biostatistics >> (650) 467-7374 >> >> "Data is not information. Information is not knowledge. And knowledge >> is certainly not wisdom." >> H. Gilbert Welch >> >> >> >> >> On Fri, May 9, 2014 at 2:41 AM, Duncan Murdoch <murdoch.dun...@gmail.com> >> wrote: >>> >>> On 09/05/2014, 2:41 AM, Bert Gunter wrote: >>>> >>>> Spencer: >>>> >>>> Hmmm.... >>>> Well, I don't get what's going on here -- as.character.default is >>>> internal -- but could you method-ize a simple synonym: >>> >>> >>> See ?InternalMethods: >>> >>> "For efficiency, internal dispatch only occurs on objects, that is those >>> for >>> which is.object returns true." >>> >>> Duncan Murdoch >>> >>> >>>> asChar<- function(e,...)UseMethod("asChar") >>>> asChar.call <- function(e,...)deparse(e,...) >>>> asChar.default <- function(e,...)as.character(e,...) >>>> >>>>> asChar(xDy) >>>> >>>> [1] "x$y" >>>> >>>>> asChar(1:5) >>>> >>>> [1] "1" "2" "3" "4" "5" >>>> >>>> >>>> Cheers, >>>> Bert >>>> >>>> Bert Gunter >>>> Genentech Nonclinical Biostatistics >>>> (650) 467-7374 >>>> >>>> "Data is not information. Information is not knowledge. And knowledge >>>> is certainly not wisdom." >>>> H. Gilbert Welch >>>> >>>> >>>> >>>> >>>> On Thu, May 8, 2014 at 8:56 PM, Spencer Graves >>>> <spencer.gra...@structuremonitoring.com> wrote: >>>>> >>>>> On 5/8/2014 8:05 PM, Bert Gunter wrote: >>>>>> >>>>>> >>>>>> [1] "x$y" >>>>>> >>>>>> Spencer: >>>>>> >>>>>> Does >>>>>> >>>>>> deparse(substitute(x$y)) >>>>>> [1] "x$y" >>>>>> >>>>>> do what you want? >>>>> >>>>> >>>>> >>>>> >>>>> No: The problem is methods dispatch. class(quote(x$y)) = >>>>> 'call', >>>>> but >>>>> as.character(quote(x$y)) does NOT go to "as.character.call". >>>>> >>>>> >>>>> deparse(quote(x$y)) returns the answer I want, as Greg Snow >>>>> noted >>>>> earlier. >>>>> >>>>> >>>>> However, it would be easier to remember if I could write >>>>> as.character(quote(x$y)) and get the same thing. >>>>> >>>>> >>>>> With "as.character.call <- function(x, ...)deparse(x, ...)", >>>>> as.character.call(quote(x$y)) returns "x$y", as desired. However, the >>>>> methods dispatch one might naively expect fails, as noted above. >>>>> >>>>> >>>>> Thanks, >>>>> Spencer >>>>> >>>>>> Cheers, >>>>>> Bert >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- Bert >>>>>> >>>>>> Bert Gunter >>>>>> Genentech Nonclinical Biostatistics >>>>>> (650) 467-7374 >>>>>> >>>>>> "Data is not information. Information is not knowledge. And knowledge >>>>>> is certainly not wisdom." >>>>>> H. Gilbert Welch >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Thu, May 8, 2014 at 5:56 PM, Spencer Graves >>>>>> <spencer.gra...@structuremonitoring.com> wrote: >>>>>>> >>>>>>> >>>>>>> "as.character.call" seems not to work as an alias for >>>>>>> deparse. >>>>>>> Consider the following: >>>>>>> >>>>>>> >>>>>>> xDy <- quote(x$y) >>>>>>> class(xDy) >>>>>>> "call" >>>>>>> as.character.call <- function(x, ...)deparse(x, ...) >>>>>>> as.character(xDy) >>>>>>> [1] "$" "x" "y" >>>>>>> # fails >>>>>>> >>>>>>> str(xDy) >>>>>>> # language x$y >>>>>>> as.character.language <- function(x, ...)"language" >>>>>>> >>>>>>> as.character(xDy) >>>>>>> [1] "$" "x" "y" >>>>>>> >>>>>>> >>>>>>> Is it feasible to construct a method for "as.character" >>>>>>> that >>>>>>> works >>>>>>> for objects of class "call"? >>>>>>> >>>>>>> >>>>>>> Thanks, >>>>>>> Spencer >>>>>>> >>>>>>> >>>>>>> ################# >>>>>>> >>>>>>> >>>>>>> Thanks for the quick replies from Richard Heiberger, Greg Show & Bert >>>>>>> Gunter. >>>>>>> >>>>>>> >>>>>>> Might it make sense to create as.character.call as an alias >>>>>>> for >>>>>>> deparse? >>>>>>> >>>>>>> >>>>>>> A few years ago, I wrote several functions like "predict.fd" >>>>>>> as >>>>>>> aliases for functions with less memorable names like "eval.fd". >>>>>>> Doing >>>>>>> that >>>>>>> made the "fda" package easier to use, at least for me ;-) >>>>>>> >>>>>>> >>>>>>> Thanks again, >>>>>>> Spencer >>>>>>> >>>>>>> >>>>>>> On 5/7/2014 2:39 PM, Bert Gunter wrote: >>>>>>>> >>>>>>>> >>>>>>>> ... and >>>>>>>> >>>>>>>>> str(quote(x$y)) >>>>>>>> >>>>>>>> >>>>>>>> language x$y >>>>>>>> >>>>>>>>> as.list(quote(x$y)) >>>>>>>> >>>>>>>> >>>>>>>> [[1]] >>>>>>>> `$` >>>>>>>> >>>>>>>> [[2]] >>>>>>>> x >>>>>>>> >>>>>>>> [[3]] >>>>>>>> y >>>>>>>> >>>>>>>> ## may be instructive. >>>>>>>> >>>>>>>> Cheers, >>>>>>>> Bert >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Bert Gunter >>>>>>>> Genentech Nonclinical Biostatistics >>>>>>>> (650) 467-7374 >>>>>>>> >>>>>>>> "Data is not information. Information is not knowledge. And >>>>>>>> knowledge >>>>>>>> is certainly not wisdom." >>>>>>>> H. Gilbert Welch >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Wed, May 7, 2014 at 2:30 PM, Greg Snow <538...@gmail.com> wrote: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> deparse(quote(x$y)) >>>>>>>>> >>>>>>>>> >>>>>>>>> [1] "x$y" >>>>>>>>> >>>>>>>>> It looks like deparse does what you want here. >>>>>>>>> >>>>>>>>> On Wed, May 7, 2014 at 3:23 PM, Spencer Graves >>>>>>>>> <spencer.gra...@structuremonitoring.com> wrote: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Hello, All: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Is there a simple utility someplace to convert >>>>>>>>>> "quote(x$y)" >>>>>>>>>> to >>>>>>>>>> "x$y"? >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> I ask, because as.character(quote(x$y)) is a character >>>>>>>>>> vector >>>>>>>>>> of >>>>>>>>>> length 3 = "$" "x" "y". I want to convert this to "x$y" for a >>>>>>>>>> diagnostic >>>>>>>>>> message. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> class(quote(x$y)) = "call", which suggests I could write >>>>>>>>>> "as.character.call" to perform this function. However, before I >>>>>>>>>> do, >>>>>>>>>> I >>>>>>>>>> felt >>>>>>>>>> a need to ask for other thoughts on this. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Spencer >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Gregory (Greg) L. Snow Ph.D. >>>>>>>>>> 538...@gmail.com >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> ______________________________________________ >>>>>>>>>> R-help@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. >>>>>>>>>> > > ______________________________________________ > R-help@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. -- http://had.co.nz/ ______________________________________________ R-help@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.