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.values
和 y.values
而不是 x.values
和 y
。
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 减少了错误进入您的代码的可能性。
例如,考虑一下如果将对象中的插槽名称更改为 x
和 y
,然后将对象传递给需要 x.values
和 y.values
。通过不允许您进行此更改,S4 排除了下行代码将获得其结构无法处理的对象的可能性。
对于您的用例,您可以单独绘制 x.values
和 y.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))
我在使用 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.values
和 y.values
而不是 x.values
和 y
。
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 减少了错误进入您的代码的可能性。
例如,考虑一下如果将对象中的插槽名称更改为 x
和 y
,然后将对象传递给需要 x.values
和 y.values
。通过不允许您进行此更改,S4 排除了下行代码将获得其结构无法处理的对象的可能性。
对于您的用例,您可以单独绘制 x.values
和 y.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))