2016-04-20 39 views
1

我的R腳本有什麼問題?我試圖用另一種用戶自定義對象中的用戶定義的對象(這裏的「頁面」對象的vector)的向量(這裏是「書」對象)如何在R中使用S4對象編程

setClass("Page", 
     slots = c(PageNo = "numeric",  #scalar 
       Contents = "character") #vector of strings 
) 

setClass("Book", 
     slots = c(Pages = "vector",  # Something wrong here? vector of pages ? "Page" or vector" or "list" 
       Title = "character") #vector of strings 
) 

setGeneric(name="AddPage", def=function(aBook, pageNo){standardGeneric("AddPage")}) 
setMethod(f="AddPage", signature="Book", 
     definition=function(aBook, pageNo) 
     { 
      page1 = new("Page") 
      [email protected] = pageNo 
      [email protected] = c([email protected], page1) # Something wrong here? 
     } 
) 

book1 = new("Book") 
[email protected] = "Sample Book" 
book1 
[email protected] 
AddPage(book1, 1) 
AddPage(book1, 2) 
[email protected] 
+0

不應該是一個numPages數字和一個方法來創建一個新的頁面項目在1 + numPages和1如果numPages的長度爲0? –

+0

它適用於「數字」PageNo。我檢查了腳本'page1 = new(「Page」)\ n \ r page1 @ PageNo = 1' – Kyun

+0

頁面有自己的頁碼,但書本需要有一個頁面數量的插槽,以便addPage可以放置一個新頁面在頁面列表中的適當位置。頁面應該是content和lastPage + 1,或者其他一些應該是新頁面的默認位置,並且可以修改現有頁面的內容。或者,您可以默認爲從Book @ Pages長度派生的多個頁面。 –

回答

2

記住,R不使用參考語義,所以AddPage(book1, 1)創建book1的副本,並更新它。在該方法中,您不返回更新的對象,並且book1保持不變。

更新的方法,使其返回修改的對象

setMethod(f="AddPage", signature="Book", 
     definition=function(aBook, pageNo) 
     { 
      page1 = new("Page") 
      [email protected] = pageNo 
      [email protected] = c([email protected], page1) # Something wrong here? 
      aBook 
     } 
) 

,並指定返回值到舊變量

book1 = AddPage(book1, 1) 

但是,這是一個非常低效的方法 - 行[email protected] = c([email protected], page1)品牌所有現有頁面的副本(在右側,創建一個更長的向量;這將按照添加到書籍頁面數量的平方來縮放),然後複製整個圖書(用於作業)。另外,創建單個對象的代價很​​高,並且不會利用R的「矢量化」。第一步是將對象'頁面'視爲'頁面',其中對象建模的是列而不是數據框的行。 'Book'沒有Page對象的向量,而是一個單獨的Pages對象。這也意味着創建「書」的方法不同。

+0

非常感謝。它解決了。 – Kyun