为了更好地理解R,我正在研究一个玩具示例。特别是,我试图强迫R不执行回收,以便在求和时产生错误
(1:2) + 1.
我试过了:
1:2 + I(1)
然后,为了检查,因为它似乎相关,我试过
"+"(1, I(TRUE))
但这也很好,这对我来说,这个阶级与强制和回收无关。我也无法弄清楚原子矢量的长度存储在何处/如何存储。
您是否知道某种方法可以防止这种回收的发生?根据我的理解,R在其内部C代码运行之前完成所有的回收/强制,但我无法弄清楚阻止它发生的地方。
答案 0 :(得分:1)
你不能在R中停止回收。但幸运的是,据我所知,回收仅适用于原子载体。所以使用矩阵!
matrix(1:2,ncol=1) + matrix(1,ncol=1,nrow=1)
会抛出尺寸不可比的错误:)
答案 1 :(得分:0)
这是一种禁止使用算术运算符进行回收的方法:
x <- 1:3
y <- 4:6
z <- 7:10 # length 4!
# give them an S3 class
class(x) <- class(y) <- class(z) <- "foo"
# define a group generic method for operators (see ?groupGeneric)
Ops.foo <- function(e1, e2) {
if(length(e1) != length(e2)){
stop("no recycling!")
}
NextMethod(.Generic)
}
x + y
#> [1] 5 7 9
#> attr(,"class")
#> [1] "foo"
x + z
#> Error in Ops.foo(x, z): no recycling!
由reprex package(v0.3.0)于2019-10-01创建
具有cbind()
之类的功能,但我认为您很不走运。