有人可以解释这个示例代码中发生了什么吗?我有一个函数,它执行计算循环,并且一如既往地想要初始化我的输出向量,而不是每次通过循环时递增它。
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
的结果
答案 0 :(得分: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