簡體   English   中英

我應該在我的 package 中使用 S3 數據幀嗎?

[英]Should I use S3 data frames in my package?

我有一個 package,它使用基於 data.frame 的 S4 class:

setClass(Class="foobar",
  slots=c(a="character", b="character", c="character"),
  contains="data.frame")

按預期工作。 但是,在與 tidyverse 結合使用時,我觀察到了奇怪的警告:

df <- data.frame(ID=1:5)
df2 <- new("foobar", df)
as_tibble(df2)

最后一條語句引發了警告信息:

Warning message:
In class(x) <- c(subclass, tibble_class) :
  Setting class(x) to multiple strings ("tbl_df", "tbl", ...); result will no longer be an S4 object

這是因為 tidyverse不支持 S4 數據幀 這可以通過使用asS3(df)在下游代碼中規避。 但是,如果看到這些警告,我的 package 的用戶可能會感到困惑。 我現在面臨以下選擇,我真的不知道哪個是最合理和正確的:

  • 保留 S4 model 並希望用戶每次將我的數據幀傳遞給其他東西時都不會介意看到此警告。
  • 使用 S3。 但是,我的 package 的已發布版本中已經定義了另一個 S4 class。 我怕我會破壞別人的代碼。
  • 混合 S3 和 S4。 甚至允許嗎?

還有其他我可能會忽略的解決方案嗎?

沒有完全在您控制范圍內的出色解決方案。

tidyverse package 可以在任何類似數據幀的 object 上調用class<- ,正如您所見,這將破壞任何 object 的 S4 特性。 這不能通過(例如)定義coerce方法或調用setAs ,因為class<-不使用該機制。 class<-也不是通用的,你不能為它設置一個方法。)讓tidyverse支持 S4 的唯一方法是讓tidyverse的作者更改代碼以使用as或類似的,它沒有看起來那是他們的待辦事項清單的首位。

當您已經發布了帶有 S4 class 的 package 版本時,您擔心會顯着改變 class 的工作方式是正確的。

如果:

  • 您的 package 很新,還沒有很多用戶;
  • 你可以用 S3 做所有你需要做的事情;
  • 你不知道另一個 package 在你的之上構建了新的類

那么最好將其重新定義為 S3,並在安裝或加載 package 時包含一條消息說

感謝您安裝 myPackage v2。 代碼可能與 v1.2 或更早版本不兼容; 有關詳細信息,請參閱幫助(等等)

否則,堅持使用S4。

對於 class 定義,您不能完全混合 S3 和 S4(您可以用於方法定義)。 最接近您的是setOldClass ,它將 S3 class 注冊為 S4 (而您想要相反)。 不過,這可能會幫助您實現上面的“您可以使用 S3 做所有您需要做的事情”。

另一種可能性是定義您自己的class<-版本,它檢查 S4 class foobar的 object 是否試圖被強制轉換為S3並調用普通class<-如果不是。 在這種情況下,治愈可能比疾病更糟; 這將減慢所有未來的 S3 class 轉換(因為class<-現在是普通的 function 調用,而不是原語),但原則上應該可以工作。 不推薦的另一個原因是您在搜索路徑中不依賴其他 package 做類似的事情(如果另一個 package 的作者有同樣的問題並想要做同樣的伎倆呢?那么結果將取決於哪個 package在search路徑上更高!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM