0

有人可以解释这个示例代码中发生了什么吗?我有一个执行计算循环的函数,并且一如既往地想要初始化我的输出向量,而不是每次通过循环递增它。

Rgames> library(Rmpfr)
Rgames> foo<-rep(NA,5)
Rgames> foo
[1] NA NA NA NA NA
Rgames> rfoo<-mpfr(rep(NA,5),20)
Rgames> rfoo
5 'mpfr' numbers of precision  20   bits 
[1] NaN NaN NaN NaN NaN
Rgames> for(jj in 1:5) {
+ foo[jj]<- mpfr(jj,10)
+ rfoo[jj]<-mpfr(jj,10)
+ }
Rgames> rfoo
5 'mpfr' numbers of precision  10   bits 
[1] 1 2 3 4 5
Rgames> foo
[[1]]
'mpfr1' 1

[[2]]
'mpfr1' 2

[[3]]
'mpfr1' 3

[[4]]
'mpfr1' 4

[[5]]
'mpfr1' 5

我不明白为什么,显然,现有的非 mpfr 向量foo不仅被强制到一个列表中,而且每次通过循环时,新值都foo[jj]作为列表插入,给我一个令人不快的“列表列表” . 在这两种情况下,mpfr向量rfoo都符合我的预期。(我检查了,如果我不初始化,并在循环中放入一些东西,就像 foo<-c(foo,mpfr(jj,10))我得到的结果相当于rfoo

4

1 回答 1

2

这里发生的事情与使用列表而不是mpfr对象时会发生的事情相同。例如,如下。我相信这是有道理的,因为 S4 对象的存储方式与列表类似,但我不是 S4 专家。

> foo <- rep(NA,2)
> foo
[1] NA NA
> foo[1] <- list(1)
> foo
[[1]]
[1] 1

[[2]]
[1] NA

我相信发生的事情是原始原子向量被强制到一个列表中,以便能够包含您要求放在那里的对象。我在这里找不到任何相关文档;我认为这在钱伯斯的书中有所讨论,但手头没有。

也可以使用方法轻松地重新创建这种行为S3;首先是S3创建新类的方法:

mynum <- function(x) {structure(as.list(x), class="mynum")}
print.mynum <- function(x) { cat("My numbers are:\n")
                             print(do.call(paste, x), quote=FALSE) }

如果您从原子向量开始,会发生以下情况:

> (foo <- rep(NA, 2))
[1] NA NA
> foo[1] <- mynum(1)
> foo
[[1]]
[1] 1

[[2]]
[1] NA

如果您从mynum向量开始,会发生以下情况:

> (rfoo <- mynum(rep(NA, 2)))
My numbers are:
[1] NA NA
> rfoo[1] <- mynum(1)
> rfoo
My numbers are:
[1] 1 NA
于 2013-01-07T21:10:05.937 回答