Thank You very much. This is a great help.
I would never ever have thought of either unRematchDefinition or getSrcref.
I will incorporate this new insight and report about any further
discoveries (or problems leading to them ;-))

Thanks again
Markus


2014/1/8 Duncan Murdoch <murdoch.dun...@gmail.com>

> On 14-01-07 2:40 PM, Markus Müller wrote:
>
>> For documentation we use a system that generates Rd files from special
>> comments in the code. (inlinedocs).
>> It is crucial to be able to get the defining source code for objects like
>> methods to extract the comments from it.
>>
>> Here is an R session that shows how this works for several kinds of
>> methods
>> and (at the end of the session) how if fails for methods of "initialize"
>>
>>  require("methods")
>>> setGeneric( "myGen",function(arg){standardGeneric("myGen")})
>>>
>> [1] "myGen"
>>
>>> setMethod(
>>>
>> +   f="myGen",
>> +   signature="numeric",
>> +   definition=function # a function with comments in its source
>> +     ### that are used to document it with inlinedocs
>> +     (arg ##<< another special comment for the argument
>> +     ){
>> +       2*arg
>> +       ### a description for the return value
>> +     }
>> + )
>> [1] "myGen"
>>
>> we can get the whole function definition with comments back
>> by the following snippet:
>>
>>> attr(getMethod("myGen","numeric"),"srcref")
>>>
>> function # a function with comments in its source
>>      ### that are used to document it with inlinedocs
>>      (arg ##<< another special comment for the argument
>>      ){
>>        2*arg
>>        ### a description for the return value
>>      }
>>
>>>
>>>
>> this also works for operators
>>
>>  setMethod("$",
>>>
>> +     signature(x = "MyClass"),
>> +     function
>> +     (x,   ##<< first arg
>> +      name ##<< second ag
>> +      ) { }
>> + )
>> [1] "$"
>>
>>> attr(getMethod("$","MyClass"),"srcref")
>>>
>> function
>>      (x,   ##<< first arg
>>       name ##<< second ag
>>       ) { }
>>
>>>
>>> setClass(
>>>
>> +    Class="MyClass",
>> +    representation(
>> +    val="numeric"
>> +    )
>> + )
>>
>> It works also for other functions already defined:
>>
>>  setGeneric("plot")
>>>
>> [1] "plot"
>>
>>> setMethod("plot",
>>>
>> +     signature(x = "MyClass"),
>> +     function # a comment
>> +     (x, y, ...)
>> +     {
>> +         stop("need a definition for the method here")
>> +     }
>> + )
>> [1] "plot"
>>
>>> attr(getMethod("plot","MyClass"),"srcref")
>>>
>> function # a comment
>>      (x, y, ...)
>>      {
>>          stop("need a definition for the method here")
>>      }
>>
>>>
>>>
>> However if we overload initialize there is no "srcref" attribute:
>>
>>  setMethod(
>>>
>> +     f="initialize",
>> +     signature="MyClass",
>> +     definition=function # here are also comments but we can not retrieve
>> them
>> +     (.Object,value){
>> +       .Object@val<- value
>> +       return(.Object)
>> +     }
>> + )
>> [1] "initialize"
>>
>>>
>>> attr(getMethod("initialize","MyClass"),"srcref")
>>>
>> NULL
>>
>> Is there a reason for this behavior, and more important still,
>> Ist there a way to get at the source of my constructors to document them
>> automatically?
>>
>
> I don't know the why of the design, but the comments are there, just not
> where you were looking.  You can get them as follows:
>
> f <- getMethod("initialize", "MyClass")
> getSrcref(unRematchDefinition(f))
>
> This should work for the other cases too, where unRematchDefinition does
> nothing.  I don't know if there are any cases where it will fail, but if
> there are, please let me know.
>
> Probably the getSrcref function should do this automatically when it sees
> that f is a method definition, but I'll wait to hear if it's the wrong
> approach.
>
> Duncan Murdoch
>
>
>

        [[alternative HTML version deleted]]

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to