Animation 将f输入R中rgl包中的play3d()和movie3d()

Animation 将f输入R中rgl包中的play3d()和movie3d(),animation,3d,rgl,Animation,3d,Rgl,我不理解rgl包中play3d和movie3d所期望的输入f 我希望有人能纠正我的代码,帮助我理解play3d和movie3d的f输入 问题1:为什么上面的play3d线条足够正确,动画显示正确 问题2:为什么上面的play3d线不正确到足以触发错误 问题3:movie3d线路没有产生视频输出有什么问题?正如文档所说,f是“一个返回可传递给par3d的列表的函数”。它不是一个列表,这是你的使用过程 回答以下问题: R计算执行动画的lappy调用,然后play3d查看结果并终止,因为它不是函数

我不理解rgl包中play3d和movie3d所期望的输入f

我希望有人能纠正我的代码,帮助我理解play3d和movie3d的f输入

问题1:为什么上面的play3d线条足够正确,动画显示正确

问题2:为什么上面的play3d线不正确到足以触发错误


问题3:movie3d线路没有产生视频输出有什么问题?

正如文档所说,
f
是“一个返回可传递给par3d的列表的函数”。它不是一个列表,这是你的使用过程

回答以下问题:

  • R计算执行动画的
    lappy
    调用,然后
    play3d
    查看结果并终止,因为它不是函数
  • f
    需要是一个函数,如帮助页面中所述
  • 当它看到
    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)
    
    库(rgl)
    
    这是一个有见地的回答。非常感谢。有一件事我仍在思考——fps在代码中的作用是什么?我试图改变它的值,但没有区别。我认为这会使球体以更快的顺序出现。我需要做什么才能使球体更快地连续出现?感谢您的帮助。
    fps
    仅适用于
    movie3d
    制作的GIF。使用
    fps=1
    ,调用该函数时
    time
    每次递增1秒,GIF将被标记为每秒显示1帧。要使事情显示得更快,请更改
    myplotfunction
    ,使其对
    df
    的行进行不同的索引。我会修改答案,让它更清楚。非常有用。非常感谢。
    play3d(f=lapply(listofobs,myplotfunction), fps=1 )
    movie3d(f=lapply(listofobs,myplotfunction), fps=1 , duration=20)
    
    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)