[R] as.character(quote(x$y) ) = "$" "x" "y" not "x$y"?

Hadley Wickham h.wickham at gmail.com
Fri May 9 23:42:58 CEST 2014


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.graves at 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.duncan at 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.graves at 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.graves at 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 <538280 at 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.graves at 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.
>>>>>>>>>> 538280 at gmail.com
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> ______________________________________________
>>>>>>>>>> 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.
>>>>>>>>>>
>
> ______________________________________________
> 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.



-- 
http://had.co.nz/



More information about the R-help mailing list