如何在R中使用S4对象编程

如何在R中使用S4对象编程,r,object,s4,R,Object,S4,我的R脚本怎么了?我试图在另一个用户定义对象(这里是“Book”对象)中使用用户定义对象的向量(这里是“Page”对象的向量) 请记住,R不使用引用语义,因此AddPage(book1,1)创建book1的副本,并对其进行更新。在方法中,不返回更新的对象,book1保持不变 更新该方法,使其返回修改后的对象 setMethod(f="AddPage", signature="Book", definition=function(aBook, pageNo) {

我的R脚本怎么了?我试图在另一个用户定义对象(这里是“Book”对象)中使用用户定义对象的向量(这里是“Page”对象的向量)


请记住,R不使用引用语义,因此
AddPage(book1,1)
创建book1的副本,并对其进行更新。在方法中,不返回更新的对象,book1保持不变

更新该方法,使其返回修改后的对象

setMethod(f="AddPage", signature="Book",
      definition=function(aBook, pageNo)
      {
          page1 = new("Page")
          page1@PageNo = pageNo
          aBook@Pages = c(aBook@Pages, page1) # Something wrong here?
          aBook
      }
)
并将返回值赋给旧变量

book1 = AddPage(book1, 1)

但这是一种非常低效的方法——行
aBook@Pages=c(aBook@Pages,第1页)
复制所有现有页面(在右侧,创建更长的向量;这将与添加到书本的页数的平方成比例),然后复制整个书本(用于作业)。此外,创建单个对象的成本很高,而且不会利用R的“矢量化”。第一步是将对象“页面”视为“页面”,其中对象对数据帧的列而不是行进行建模Book’则没有页面对象的向量,而是一个页面对象。这也意味着创建“书”的方法不同。

不应该是一个numPages数字,并且如果numPages的长度为0,则应该是1+numPages,如果numPages的长度为0,则应该是1来创建新页面项的方法吗?它与“numeric”PageNo配合得很好。我使用脚本“page1=new”(“Page”)进行了检查\n\r\npage1@PageNo=1'一页有自己的页码,但书籍需要有一个页数插槽,以便addPage可以在页数列表中的适当位置放置新页。页面应该是内容,lastPage+1或某些这样的页面应该是新页面的默认位置,可以修改现有页面的内容。或者,可以默认为从长度派生的页面数Book@Pages.
book1 = AddPage(book1, 1)