我試圖測驗不同 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
我知道我比較的方法/函式在 R 中的實作方式非常不同,并且根據給定方法的實作方式,比較失敗似乎存在一種模式,但是我想知道函式的行為是否是這樣的(我在檔案中找不到關于要比較的物件順序的注釋)。我也很好奇,如果有人能向我解釋這種行為,我將不勝感激。
從終端時,我也可以在 R --vanilla 中重現這些問題。
會話資訊:
R 版本 4.1.3 (2022-03-10) 平臺:x86_64-pc-linux-gnu (64-bit) 運行于: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] stats graphics grDevices utils
datasets methods base通過命名空間加載(未附加):[1] compiler_4.1.3
Edit: Tried the code samples on Rstudio Server and could NOT reproduce above behavior. Outputs of all.equal Function also differ
Session Info:
R version 4.0.3 (2020-10-10) Platform: x86_64-suse-linux-gnu (64-bit) Running under: openSUSE Leap 15.2
Matrix products: default BLAS: /usr/lib64/R/lib/libRblas.so LAPACK: /usr/lib64/R/lib/libRlapack.so
locale: [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=Cattached base packages: [1] stats graphics grDevices utils
datasets methods base通過命名空間加載(未附加):[1] compiler_4.0.3 tools_4.0.3
uj5u.com熱心網友回復:
我跟著錯誤all.equal(sd,mean),它實際上源于呼叫all.equal.environment(environment(sd), environment(mean), ignore.environment = FALSE)。
從 的檔案中all.equal(),我們看到 environment 方法有一個額外的引數evaluate,它是
邏輯表明是否“應強制承諾”
這默認為 true,并且似乎會導致堆疊使用問題。
要修復它,只需呼叫all.equal(..., evaluate = FALSE):
all.equal(mean, sd, evaluate = FALSE)
#> [1] "target, current do not match when deparsed"
#> [2] "names of environments differ: Lengths (1370, 1134) differ (string compare on first 1134) names of environments differ: 1134 string mismatches"
由reprex 包于 2022-03-29 創建(v2.0.1)
結果:
all.equal(mean, sd, evaluate = FALSE) # no Error
all.equal(sd,mean, evaluate = FALSE) # no Error
all.equal(NULL, mean, evaluate = FALSE) # no Error
all.equal(mean,NULL, evaluate = FALSE) # no Error
all.equal(mean, sum, evaluate = FALSE) # no Error
all.equal(sum,NULL, evaluate = FALSE) # no Error
all.equal(sd, var, evaluate = FALSE) # no Error
all.equal(var, mean, evaluate = FALSE) # no Error
all.equal(var, NULL, evaluate = FALSE) # no Error
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455061.html
下一篇:如何從(雙重)遞回函式輸出?
