[Rd] parent.frame(n) produces different result from sys.frame(sys.parent(n))

Taras Zakharko t@r@@@z@kh@rko @end|ng |rom uzh@ch
Wed Sep 28 12:50:18 CEST 2022


Thanks Brodie, this certainly seems like the same issue! I’ll add some comments to the issue tracker and hope that this can finally be fixed. 

Best, 

Taras



 

> On 28 Sep 2022, at 12:33, Brodie Gaslam <brodie.gaslam using yahoo.com> wrote:
> 
> Hi Taras,
> 
> I have not looked in detail at your examples here, but the
> use of evalq and sys.parent makes me think these issues:
> 
> https://bugs.r-project.org/show_bug.cgi?id=17849
> https://bugs.r-project.org/show_bug.cgi?id=15531
> 
> are possibly related.
> 
> Best,
> 
> B.
> 
> 
> 
> On Wednesday, September 28, 2022 at 05:29:08 AM EDT, Taras Zakharko <taras.zakharko using uzh.ch> wrote: 
> 
> 
> 
> 
> 
> Dear all, 
> 
> The documentation states that parent.frame(n) is equivalent to sys.frame(sys.parent(n)) but I have discovered a case where they produce different results. Before I submit a bug report I thought it would be good to run it by the R community in case it’s (somehow?) expected behaviour. Consider the following MRE (this is R 4.2.1 running on Apple M1):
> 
>   f1 <- function() {
>     f2()
>   }
>   
>   f2 <- function() {
>     f3()
>   }
>   
>   f3 <- function() {
>     evalq(check_parents(), parent.frame())
>   }
>   
>   check_parents <- function() {
>     print(vctrs::data_frame(
>       call = as.list(sys.calls()),
>       frame = as.list(sys.frames()),
>       parent = as.list(sys.parents())
>     ))
>   
>     print(parent.frame(2L))
>     print(sys.frame(sys.parent(2L)))
>   }
>   
>   f1()
> 
> This produces
> 
>                                     call                          frame                                          parent
> 1                                  f1()                        <environment: 0x10785d408>      0
> 2                                  f2()                        <environment: 0x107898830>      1
> 3                                  f3()                        <environment: 0x107898788>      2
> 4 evalq(check_parents(), parent.frame())  <environment: 0x1078a1f30>      3
> 5 evalq(check_parents(), parent.frame())  <environment: 0x107898830>      4
> 6                        check_parents()              <environment: 0x1078a1b08>      2
> <environment: 0x1078a1f30>  # parent.frame(2L)
> <environment: 0x10785d408> # sys.frame(sys.parent(2L))
> 
> It seems like parent.frame(2L) resolves to frame 4 which is not part of the call stack of frame 6 at all. I haven’t yet looked at the C code. 
> 
> Best, 
> 
> Taras 
> 
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list