使用“[”与“[[”将 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
。
我遗漏了 [<- 和 [[<- 运算符如何处理 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
。