R OOP 改变一个槽的名字

R OOP change the name of a slot

我在使用 MLR 包时偶然发现了 S4 对象的问题。更具体地说,是导致问题的插槽名称。我正在寻找一种方法来更改插槽的 名称 而不是 的值。

下面是生成相关对象的可重现代码示例:

lrn1 = makeLearner("classif.lda", predict.type = "prob")
lrn2 = makeLearner("classif.ksvm", predict.type = "prob")
lrns = list(lrn1, lrn2)
rdesc.outer = makeResampleDesc("CV", iters = 5)

ms = list(auc, mmce)

bmr = benchmark(lrns, tasks = sonar.task, resampling = rdesc.outer, 
                measures = ms, show.info = FALSE)


preds = getBMRPredictions(bmr, drop = TRUE)


ROCRpreds = lapply(preds, asROCRPrediction)


ROCRperfs = lapply(ROCRpreds, function(x) ROCR::performance(x, "tpr", "fpr"))

对象由两个列表组成,我需要更改两个列表中的名称槽。名称应分别为 x.valuesy.values 而不是 x.valuesy

str(ROCRperfs$classif.lda)

Formal class 'performance' [package "ROCR"] with 6 slots
  ..@ x.name      : chr "False positive rate"
  ..@ y.name      : chr "True positive rate"
  ..@ alpha.name  : chr "Cutoff"
  ..@ x.values    :List of 5
  .. ..$ : num [1:43] 0 0 0 0 0 ...
  .. ..$ : num [1:42] 0 0 0 0.0526 0.0526 ...
  .. ..$ : num [1:42] 0 0 0 0.05 0.05 0.05 0.05 0.05 0.05 0.05 ...
  .. ..$ : num [1:43] 0 0 0.0476 0.0476 0.0476 ...
  .. ..$ : num [1:43] 0 0 0 0 0 ...
  ..@ y.values    :List of 5
  .. ..$ : num [1:43] 0 0.0417 0.0833 0.125 0.1667 ...
  .. ..$ : num [1:42] 0 0.0455 0.0909 0.0909 0.1364 ...
  .. ..$ : num [1:42] 0 0.0476 0.0952 0.0952 0.1429 ...
  .. ..$ : num [1:43] 0 0.0476 0.0476 0.0952 0.1429 ...
  .. ..$ : num [1:43] 0 0.0435 0.087 0.1304 0.1739 ...
  ..@ alpha.values:List of 5
  .. ..$ : num [1:43] Inf 1 1 1 1 ...
  .. ..$ : num [1:42] Inf 1 1 1 0.999 ...
  .. ..$ : num [1:42] Inf 1 1 1 1 ...
  .. ..$ : num [1:43] Inf 1 1 0.999 0.999 ...
  .. ..$ : num [1:43] Inf 1 1 1 1 ...

由于我是 R 中 OOP 的初学者,我所能做的就是用 slot() 打印插槽。

最重要的是,我想对有问题的对象做的就是绘制如下:

plot(ROCRperfs[[1]], col = "blue", avg = "vertical", spread.estimate = "stderror",
  show.spread.at = seq(0.1, 0.8, 0.1), plotCI.col = "blue", plotCI.lwd = 2, lwd = 2)

S4 class 的结构一旦定义就无法更改。这是一个功能,而不是错误。通过对可以执行的操作施加限制,S4 减少了错误进入您的代码的可能性。

例如,考虑一下如果将对象中的插槽名称更改为 xy,然后将对象传递给需要 x.valuesy.values。通过不允许您进行此更改,S4 排除了下行代码将获得其结构无法处理的对象的可能性。

对于您的用例,您可以单独绘制 x.valuesy.values 槽:

plot(ROCRperfs[[1]]@x.values, ROCRperfs[[1]]@y.values,
     col = "blue", avg = "vertical", spread.estimate = "stderror",
     show.spread.at = seq(0.1, 0.8, 0.1), plotCI.col = "blue",
     plotCI.lwd = 2, lwd = 2))