1. ホーム
  2. animation

[解決済み] R の rgl パッケージの play3d() と movie3d() に f を入力する。

2022-02-19 07:20:10

質問

rglパッケージのplay3dとmovie3dが期待する入力fがよくわからないのですが。

library(rgl)

nobs<-10
x<-runif(nobs)
y<-runif(nobs)
z<-runif(nobs)
n<-rep(1:nobs)
df<-as.data.frame(cbind(x,y,z,n))
listofobs<-split(df,n)

plot3d(df[,1],df[,2],df[,3], type = "n", radius = .2 )

myplotfunction<-function(x) {
  rgl.spheres(x=x$x,y=x$y,z=x$z, type="s", r=0.025)
}

以下の2行を実行すると、アニメーションは再生されますが、play3d()とmovie3d()の2行とも、以下のようなエラーが表示されるようになります。

play3d(f=lapply(listofobs,myplotfunction), fps=1 )
movie3d(f=lapply(listofobs,myplotfunction), fps=1 , duration=20)

私は誰かが私のコードを修正し、play3dとmovie3dへのf入力を理解するのを助けてくれることを期待しています。

質問1 : なぜ、上記のplay3dの行は、アニメーションが正しく表示されるほど正しいのでしょうか?

質問2 : なぜ上記のplay3dの行はエラーが発生するほど不正確なのでしょうか?

質問3 : movie3dのラインがビデオ出力されないのは、何が問題なのでしょうか?

解決方法を教えてください。

ドキュメントにあるように f は "par3d"に渡される可能性のあるリストを返す関数です。あなたの使い方が渡すのはリストではありません。

質問にお答えします。

  1. Rが評価するのは lapply の呼び出しがあり、それがアニメーションを行い、その後 play3d を見ると、関数ではないので死んでしまいます。
  2. f は、ヘルプページで説明されているように、関数である必要があります。
  3. を見ると死んでしまいます。 f なぜなら、これは関数ではないからです。

これなら思い通りになりそうですね。

library(rgl)

nobs<-10
x<-runif(nobs)
y<-runif(nobs)
z<-runif(nobs)
df<-data.frame(x,y,z)

plot3d(df, type = "n" ) 
id <- NA
myplotfunction<-function(time) {
  index <- round(time)
  # For a 3x faster display, use index <- round(3*time)
  # To cycle through the points several times, use 
  # index <- round(3*time) %% nobs + 1
  if (!is.na(id))
    pop3d(id = id) # Delete previous item
  id <<- spheres3d(df[index,], r=0.025)
  list()
}

play3d(myplotfunction, startTime = 1, duration = nobs - 1)
movie3d(myplotfunction, startTime = 1, duration = nobs - 1, fps = 1)

この場合、GIFは file.path(tempdir(), "movie.gif") .

その他、注意事項があります。

  • を呼び出さないでください。 rgl.spheres . 後で大変な思いをすることになります。 使う spheres3d または 決して を呼び出すことができます。 *3d 関数をアップグレードすることはありません。 rgl : を使って過去に生きているんですね。 rgl.* 関数を使用します。 は、その *3d 関数と rgl.* 関数はうまく連携してくれません。
  • を使用してデータフレームを構築します。 data.frame() 関数に変換しないでください。 は行列です。
  • データフレームからポイントを抽出するために、そのような複雑な操作は必要ない。
  • ほとんどのrgl関数は、データフレームに x , y および z カラムを使用します。
  • に気づくかもしれません。 plot3d 球体は点よりも大きいので、球体を収容するために調整されます。 そのため xlim , ylimzlim を使えば、元のフレームを少し大きく設定することができます。