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
parent.frame(n) produces different result from sys.frame(sys.parent(n))
3 messages · brodie gaslam, Taras Zakharko
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 at 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 at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
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 at 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 at 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 at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel