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

fooどうやら、既存の非mpfrベクトルがリストに強制されるだけでなく、ループを通過するたびに新しい値がリストとして挿入さ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 に答える