![](/img/trans.png)
[英]What loss function in cross-validation should I use with R package BNlearn for my data?
[英]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 的用戶可能會感到困惑。 我現在面臨以下選擇,我真的不知道哪個是最合理和正確的:
還有其他我可能會忽略的解決方案嗎?
沒有完全在您控制范圍內的出色解決方案。
tidyverse
package 可以在任何類似數據幀的 object 上調用class<-
,正如您所見,這將破壞任何 object 的 S4 特性。 這不能通過(例如)定義coerce
方法或調用setAs
,因為class<-
不使用該機制。 ( class<-
也不是通用的,你不能為它設置一個方法。)讓tidyverse
支持 S4 的唯一方法是讓tidyverse
的作者更改代碼以使用as
或類似的,它沒有看起來那是他們的待辦事項清單的首位。
當您已經發布了帶有 S4 class 的 package 版本時,您擔心會顯着改變 class 的工作方式是正確的。
如果:
那么最好將其重新定義為 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.