Как найти атрибут объекта R6 по символьному вектору

У меня есть следующий класс, который начинается следующим образом:

dataSeries <- R6Class("dataSeries",
                  public = list(
                    geoAccession = NULL,
                    species = NULL,
                    tissue = NULL,
                    seuratObjectPath = NULL,
                    markerType = NULL,
                    clusters = NULL,
                    clusterTable = NULL,
                    clusterSymbols = NULL,
                    clusterPVs = NULL,
                    clusterGIDs = NULL,
                    clusterKGs = NULL,
                    clusterKPs = NULL,
                    clusterKOs = NULL,

У меня есть другой класс, который начинается следующим образом:

metaSeries <- R6Class("metaSeries",
                  public = list(
                    seriesList = NULL,

                    initialize = function(dataDir="Data/Data_Series/Current"){
                      browser()
                      if(!is.null(dataDir)){
                        toProcess = list.files(dataDir,full.names = T)
                        self$seriesList = vector("list", length(toProcess))
                        count = 1
                        for(file in toProcess){
                          series <- readRDS(file)
                          self$seriesList[[count]] <- series
                          count = count + 1
                        }
                      }
                    },
                    findMetaFeatures = function(feature="clusterKPs", rank=3, plot=TRUE){

На практике metaSeries$seriesList будет инициализирован как список типа dataSeries. dataSeries$findMetaFeatures должен иметь возможность вызывать функцию dataSeries$seriesList[[i]]$, где функция находится в {clusterGIDs,clusterKGs,clusterKPs,clusterKOs}. По умолчанию findMetaFeatures вызывается с feature="clusterKPs". В metaSeries$findMetaFeatures мне нужен способ сопоставления строки "clusterKPs" с атрибутом с таким именем при проверке некоторого объекта типа dataSeries, расположенного в self$seriesList.

1 ответ

Решение

Для дальнейшего использования Colin FAY прав; Вы должны предоставить гораздо больше контекста и, как правило, действительно должны предоставить как минимум минимальный объем кода, который понадобится для воспроизведения вашей проблемы, чтобы помочь другим на самом деле узнать, с чем вам нужна помощь.

Тем не менее, ответ на вопрос, который, я полагаю, вы задаете, относительно прост: вы можете получить доступ к открытым полям объектов класса R6, используя символьный вектор, используя as.list:

library(R6)
myClass <- R6Class('myClass',
                   public = list(
                       someData = NULL,
                       initialize=function(someData = NA){
                           self$someData <- someData
                       },
                       set_someData = function(val){
                           self$someData <- val
                       }
                   )
)
myObject <- myClass$new(someData='a')
class(myObject)
[1] "myClass" "R6"
class(myObject$someData)
[1] "character"
myObject$someData
[1] "a"
as.list(myObject)[['someData']]
[1] "a"

Это может быть одним из способов легкого доступа к одному и тому же полю множества объектов одного и того же класса R6.

РЕДАКТИРОВАТЬ:

Увидев часть вашего кода, я немного яснее вижу, чего вы хотите достичь. Ответ тот же, вы просто реализуете его в публичной функции вашего класса R6 следующим образом:

library(R6)
myClass <- R6Class('myClass',
                   public = list(
                       someData = NULL,
                       initialize=function(someData = NA){
                           self$someData <- someData
                       },
                       set_someData = function(val){
                           self$someData <- val
                       },
                       find_features = function(feature='otherData'){
                           if ( !('list' %in% class(self$someData)) ) {
                               if ( !('mySubClass' %in% class(self$someData)) ){
                                   stop('someData does not have the feature')
                               }
                               return(as.list(self$someData)[feature])
                           }
                           return(lapply(self$someData, function(x){
                               as.list(x)[feature]
                           }))
                       }
                   )
)

mySubClass <- R6Class('mySubClass',
                      public = list(
                          otherData = NULL,
                          initialize = function(otherData = NA){
                              self$otherData <- otherData
                          }
                      )
)

mySubObject1 <- mySubClass$new(otherData=1:3)
mySubObject2 <- mySubClass$new(otherData=4:6)
myObject <- myClass$new(someData=list(mySubObject1, mySubObject2))
myObject$find_features()
[[1]]
[[1]]$otherData
[1] 1 2 3


[[2]]
[[2]]$otherData
[1] 4 5 6

Вы можете избавиться от одного уровня результирующего списка, используя [[feature]] вместо [feature] при определении find_features:

myClass <- R6Class('myClass',
                   public = list(
                       someData = NULL,
                       initialize=function(someData = NA){
                           self$someData <- someData
                       },
                       set_someData = function(val){
                           self$someData <- val
                       },
                       find_features = function(feature='otherData'){
                           if ( !('list' %in% class(self$someData)) ) {
                               if ( !('mySubClass' %in% class(self$someData)) ){
                                   stop('someData does not have the feature')
                               }
                               return(as.list(self$someData)[[feature]])
                           }
                           return(lapply(self$someData, function(x){
                               as.list(x)[[feature]]
                           }))
                       }
                   )
)
myObject <- myClass$new(someData=list(mySubObject1, mySubObject2))    
myObject$find_features()
[[1]]
[1] 1 2 3

[[2]]
[1] 4 5 6
Другие вопросы по тегам