Agn*_*sie 2 recursion r object-comparison
我试图测试不同 R 对象的相等性,发现有时,当以错误的顺序比较对象时,会发生以下错误:
错误:C 堆栈使用量 7975620 太接近限制
我说得对吗,这是递归太深的标志?
通过以下比较应该可以重现:
all.equal(mean, sd) # no error
all.equal(sd,mean) # Error: C stack usage 7975620 is too close to the limit
all.equal(NULL, mean) # no error
all.equal(mean,NULL) # Error: C stack usage 7975620 is too close to the limit
all.equal(mean, sum); all.equal(sd, sum) # no Error
all.equal(sum,NULL) # no error
all.equal(sd, var) # no error
all.equal(var, mean) # Error: C stack usage 7975620 is too close to the limit
all.equal(var, NULL) # Error: C stack usage 7975620 is too close to the limit
Run Code Online (Sandbox Code Playgroud)
我知道我比较的方法/函数在 R 中的实现方式完全不同,并且根据给定方法的实现方式,比较失败似乎存在一种模式,但是我想知道该函数的行为是否是这样的(我在文档中找不到有关要比较的对象顺序的注释)。我也对此感到好奇,如果有人能向我解释这种行为,我将非常感激。
我还可以从终端在 R --vanilla 中重现这些问题。
会议信息:
R 版本 4.1.3 (2022-03-10) 平台:x86_64-pc-linux-gnu(64 位) 运行环境:Ubuntu 20.04.4 LTS
矩阵产品:默认 BLAS:
/usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 LAPACK:/usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0区域设置: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=de_DE.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=de_DE.UTF-8 LC_MESSAGES=en_US.UTF-8 [ 7] LC_PAPER=de_DE.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C附加的基础包: [1] 统计图形 grDevices utils
数据集 方法基础通过命名空间加载(且未附加):[1]compiler_4.1.3
编辑:尝试了 Rstudio Server 上的代码示例,但无法重现上述行为。all.equal 函数的输出也不同
会议信息:
R 版本 4.0.3 (2020-10-10) 平台:x86_64-suse-linux-gnu(64 位) 运行环境:openSUSE Leap 15.2
Matrix 产品:默认 BLAS:/usr/lib64/R/lib/libRblas.so LAPACK:/usr/lib64/R/lib/libRlapack.so
区域设置: [1] LC_CTYPE=de_DE.UTF-8 LC_NUMERIC=C
LC_TIME=de_DE.UTF-8 LC_COLLATE=de_DE.UTF-8
LC_MONETARY=de_DE.UTF-8 [6] LC_MESSAGES=de_DE.UTF-8
LC_PAPER=de_DE。 UTF-8 LC_NAME=C LC_ADDRESS=C
LC_TELEPHONE=C [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C附加的基础包: [1] 统计图形 grDevices utils
数据集 方法基础通过命名空间加载(且未附加):[1]compiler_4.0.3tools_4.0.3
我跟踪了错误all.equal(sd,mean),它实际上源于调用all.equal.environment(environment(sd), environment(mean), ignore.environment = FALSE)。
从 的文档中all.equal(),我们看到环境方法有一个额外的参数,evaluate它是
\n\n逻辑指示是否应强制\xe2\x80\x9c承诺\xe2\x80\x9d
\n
这默认为 true,并且似乎会导致堆栈使用问题。
\n要修复它,只需调用all.equal(..., evaluate = FALSE):
all.equal(mean, sd, evaluate = FALSE)\n#> [1] "target, current do not match when deparsed" \n#> [2] "names of environments differ: Lengths (1370, 1134) differ (string compare on first 1134) names of environments differ: 1134 string mismatches"\nRun Code Online (Sandbox Code Playgroud)\n由reprex 包(v2.0.1)于 2022-03-29 创建
\nall.equal(mean, sd, evaluate = FALSE) # no Error\nall.equal(sd,mean, evaluate = FALSE) # no Error\nall.equal(NULL, mean, evaluate = FALSE) # no Error\nall.equal(mean,NULL, evaluate = FALSE) # no Error\nall.equal(mean, sum, evaluate = FALSE) # no Error\nall.equal(sum,NULL, evaluate = FALSE) # no Error\nall.equal(sd, var, evaluate = FALSE) # no Error\nall.equal(var, mean, evaluate = FALSE) # no Error\nall.equal(var, NULL, evaluate = FALSE) # no Error\nRun Code Online (Sandbox Code Playgroud)\n