使用“[”与“[[”将 S4 分配给列表之间的区别

difference between assigning S4 to a list with "[" vs. "[["

我遗漏了 [<-[[<- 运算符如何处理 S4 对象的内容。这是一个快速示例。看起来 [<- 运算符以某种方式在作业中下潜了一个插槽级别(为笨拙的行话道歉)。到底发生了什么?

> blist <- list()
> blist[[1]] <- mpfr(5,10)
> blist[2] <- mpfr(7,10)
> blist
[[1]]
1 'mpfr' number of precision  10   bits 
[1] 5

[[2]]
'mpfr1' 7

> slotNames(blist[[2]])
[1] "prec" "exp"  "sign" "d"   
> slotNames(blist[[1]])
[1] ".Data"

> mp1d <- blist[[1]]@.Data
> mp1d
[[1]]
'mpfr1' 5

> slotNames(mp1d[[1]])
[1] "prec" "exp"  "sign" "d"

blist 是一个列表。分配给 blist[[1]] 应始终将对象分配到该位置。赋值给 blist[1] 需要将 RHS 转换为长度为 1 的列表,然后将其条目放入该位置。

但是 Rmpfr::mpfr 对象的创建方式是作为具有正式 class 的列表对象。所以转换为列表只是删除了正式的 class。以下是 mpfr class 定义的前两行:

setClass("mpfr", ## a *vector* of "mpfr1", i.e., multi-precision float numbers
         contains = "list", ## of "mpfr1" entries:

contains = "list" 部分表示 mpfr 派生自 list