正如主題描述的那樣,我正在尋找一種方法來實作這一點:
require("R6")
R6cls <- R6::R6Class("R6obj",
public = list(val = 1, foo = function() "foo!")
)
# check this R6 class
r6o <- R6cls$new()
r6o
# <R6obj>
# Public:
# clone: function (deep = FALSE)
# foo: function ()
# val: 1
# now the S4 part
S4wR6slot <- function() new("S4wR6slot")
setClass("S4wR6slot", contains = "environment", # or maybe "R6" or "R6cls"? tried them all but none seemed to work
slots = list(a = "R6cls", b = "character"))
# Currently gives
Warning message:
undefined slot classes in definition of "S4wR6slot": a(class "R6cls")
# but you can still kind of use it
s4r6 <- S4wR6slot()
s4r6
# An object of class "S4wR6slot"
# <environment: 0x00000179de2da628>
# Slot "a":
# NULL
#
# Slot "b":
# character(0)
s4r6@b <- "text" # works nicely
# BUT trying to assign to that env slot
s4r6@a <- r6o
# will throw these "ugly" errors
Error in (function (cl, name, valueClass) :
c("assignment of an object of class “R6obj” is not valid for @‘a’ in an object of class “S4wR6slot”; is(value, \"R6cls\") is not TRUE",
"assignment of an object of class “R6” is not valid for @‘a’ in an object of class “S4wR6slot”; is(value, \"R6cls\") is not TRUE")
玩弄setOldClass()也沒有什么好處。也許根本沒有辦法讓這項作業 - 只是詢問某人是否有想法?或者甚至可以實作這一點 - 否則也許我的 rtfm 不夠好,有人可以指出我的檔案,它說你不應該嘗試完成這項作業?
uj5u.com熱心網友回復:
有一種方法可以在 S4 類中包含一個 R6 物件,但涉及通過定義一個S4名為“R6”的類來欺騙 S4 系統。這將防止methods包抱怨 R6 類不存在。幸運的是,它實際上并沒有檢查原型中的“R6”物件是否為 S4 型別,允許您將實際的 R6 物件粘貼到其中。
library(R6)
R6cls <- R6::R6Class("R6obj",
public = list(val = 1, foo = function() "foo!")
)
setClass('R6')
setClass("S4wR6slot", slots = list(a = 'R6', b = "character"),
prototype = list(a = R6cls$new(), b = 'Hello'))
S4wR6slot <- function() new("S4wR6slot")
myS4 <- S4wR6slot()
class(myS4)
#> [1] "S4wR6slot"
#> attr(,"package")
#> [1] ".GlobalEnv"
isS4(myS4)
#> [1] TRUE
myS4@a
#> <R6obj>
#> Public:
#> clone: function (deep = FALSE)
#> foo: function ()
#> val: 1
uj5u.com熱心網友回復:
我還為這個簡單的示例類找到了一個似乎可行的解決方案 - 但遺憾的是,該解決方案有趣地失敗/失敗了更復雜的 R6 類。
在此處添加該示例解決方案以確保完整性
require(R6)
R6cls <- R6::R6Class("R6obj",
public = list(val = 1, foo = function() "foo!")
)
# check this R6 class
r6o <- R6cls$new()
r6o
# <R6obj> # <- I SUDDENLY NOTICED THIS on a second look!
# Public:
# clone: function (deep = FALSE)
# foo: function ()
# val: 1
S4wR6slot <- function() new("S4wR6slot")
setClass("S4wR6slot", contains = "environment",
slots = list(a = "R6obj" , b = "character"))
# list(a = "R6obj" ... is what did the "magic"
s4r6 <- S4wR6slot()
s4r6
# An object of class "S4wR6slot"
# <environment: 0x000002520292f470>
# Slot "a":
# NULL
#
# Slot "b":
# character(0)
s4r6@b <- "text"
s4r6@a <- r6o # THIS THEN WORKED/WORKS!
class(r6o)
# [1] "R6obj" "R6" # I simply used that "R6obj" in the S4 definition above
is(r6o, "R6")
# [1] TRUE
is(r6o, "R6obj")
# [1] TRUE
但不知何故,“Robj”類(型別)在更復雜的設定中丟失了,即我正在使用在另一個包中的一個包中定義的 R6 類,然后“R6obj”不再可供使用。:-(
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/488583.html
上一篇:從R中以數字結尾的目錄中選擇檔案
下一篇:R逗號和字串中的計數問題
