[Rd] parent.frame(1) of a S4 method is not a calling environment.
Martin Morgan
mtmorgan at fhcrc.org
Mon Aug 16 21:12:44 CEST 2010
On 08/15/2010 02:39 PM, Vitaly S. wrote:
>
> Dear Developers,
>
> I wonder what are the parent.frame rules for methods. For ordinary functions one
> can call parent.frame() and be sure that it is the environment of a calling
> function. With S4 aparently it is not the case.
>
> Here is what I have discovered by trial and error so far:
>
>> setClass("A", contains="vector")
> [1] "A"
>> setGeneric("foo", def=function(a, ...){standardGeneric("foo")})
> [1] "foo"
>>
>> setMethod("foo", signature("A"),
> + def=function(a, ...){
> + cat("--pf1--\n")
> + ls(parent.frame(1))
> + ## cat("--pf2--")
> + ## ls(parent.frame(2))
> + })
> [1] "foo"
>>
>> tf <- function(){
> + b <- 4
> + foo(new("A")) #ok
> + }
>>
>> tf() #ok
> --pf1--
> [1] "b"
>
> The above works like predicted.
> Now, a small change. The "b" argument which is not in the signature, but has a
> role of an additional parameter to the function:
>
>> setMethod("foo", signature("A"),
> + def=function(a, b, ...){
> + cat("--pf1--\n")
> + print(ls(parent.frame(1)))
> + cat("--pf2--\n")
> + print(ls(parent.frame(2)))
> + })
> [1] "foo"
>>
>> tf() #oups
> --pf1--
> [1] "a"
> --pf2--
> [1] "b"
>>
>
> So, can I be sure that for such functions parent.frame(2) will always work?
> What are the additional rules?
callNextMethod() will cause additional problems; the idea that you'll
grab things from somewhere other than function arguments doesn't seem
like a robust design, even if it's used in some important parts of R.
Martin
>
> Many thanks,
> Vitaly.
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
--
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109
Location: Arnold Building M1 B861
Phone: (206) 667-2793
More information about the R-devel
mailing list