2016-03-29 51 views
0

我使用包BsMD來繪製貝葉斯篩選(plot.BsProb)的邊際因子後驗概率。我想更改xlab和ylab,但我得到一個錯誤:R在嘗試更改xlab時plot.BsProb中的錯誤

library(BsMD) 

X = matrix(c(1, 1, 1, 1, 1,-1,-1,-1,-1,-1,-1, 1, 1, 1,-1,-1,-1,-1,-1, 
      1,-1, 1,-1,-1, 1,-1, 1,-1, 1,-1,-1,-1,-1,-1, 1,-1,-1,-1, 
      -1,-1, 1, 1, 1, 1, 1,-1,-1,-1, 1,-1, 1, 1, 1, 1,-1,-1, 1, 
      1, 1, 1,-1,-1, 1, 1, 1,-1,-1,-1, 1,-1,-1, 1, 1, 1,-1,-1, 
      1, 1,-1, 1,-1, 1,-1,-1, 1,-1, 1, 1, 1,-1, 1,-1, 1, 1,-1 
      ),nrow=19,ncol=5)  
y = matrix(c(6,2,4,11,17,4,2,6,18,11,10,12,12,15,5,9,11,10,9),nrow=19,ncol=1) 

Models = BsProb(X = X, y = y, blk = 0, mFac = 5, mInt = 1, p = 0.25, g = 2.5, ng = 1, nMod = 5) 
plot(Models, code=FALSE, xlab="asdasdasdasd") 

Error in plot.default(x, y[, 1], xlim = range(x), ylim = c(0, 1), type = "n", : formal argument "xlab" matched by multiple actual arguments.

可以請人幫我換了xlab和ylab密謀「型號」?

回答

1

您可以暫時更改標籤顏色的par設置,然後使用title添加標籤。

## create plot with white axis labels 
par(col.lab = "white") 
plot(Models, code = FALSE) 

## add customized axis labels 
par(col.lab = "black") 
title(xlab = "X-axis label", ylab = "Y-axis label") 

enter image description here

+0

聰明的想法,+1。 – bgoldst

1

好老traceback()告訴我們這裏發生了什麼:

plot(Models, code=FALSE, xlab="asdasdasdasd"); 
## Error in plot.default(x, y[, 1], xlim = range(x), ylim = c(0, 1), type = "n", : 
## formal argument "xlab" matched by multiple actual arguments 
traceback(); 
## 5: plot.default(x, y[, 1], xlim = range(x), ylim = c(0, 1), type = "n", 
##  xlab = "factors", ylab = "posterior probability", frame = FALSE, 
##  axes = FALSE, ...) 
## 4: plot(x, y[, 1], xlim = range(x), ylim = c(0, 1), type = "n", 
##  xlab = "factors", ylab = "posterior probability", frame = FALSE, 
##  axes = FALSE, ...) 
## 3: spikes(prob, ...) 
## 2: plot.BsProb(Models, code = FALSE, xlab = "asdasdasdasd") 
## 1: plot(Models, code = FALSE, xlab = "asdasdasdasd") 

Models對象是S3-歸類爲BsProb

class(Models); 
## [1] "BsProb" "list" 

因此運行plot(Models,...)個分派給plot.BsProb()其中BsMD私人環境下存在:

BsMD:::plot.BsProb; 
## function (x, code = TRUE, prt = FALSE, cex.axis = par("cex.axis"), 
##  ...) 
## { 
##  spikes <- function(prob, lwd = 3, ...) { 
##   y <- prob 
##   n <- nrow(y) 
##   x <- seq(n) 
##   lab <- rownames(prob) 
##   plot(x, y[, 1], xlim = range(x), ylim = c(0, 1), type = "n", 
##    xlab = "factors", ylab = "posterior probability", 
##    frame = FALSE, axes = FALSE, ...) 
##   if (ncol(y) == 1) { 
##    for (i in x) segments(x[i], 0, x[i], y[i, 1], lwd = lwd, 
##     col = grey(0.2)) 
##   } 
##   else { 
##    y[, 1] <- apply(prob, 1, min) 
##    y[, 2] <- apply(prob, 1, max) 
##    for (i in x) { 
##     segments(x[i], 0, x[i], y[i, 2], lwd = lwd, col = grey(0.8), 
##     lty = 1) 
##     segments(x[i], 0, x[i], y[i, 1], lwd = lwd, col = grey(0.2), 
##     lty = 1) 
##    } 
##   } 
##   axis(1, at = x, labels = lab, line = 0, cex.axis = cex.axis) 
##   axis(2, cex.axis = cex.axis) 
##   invisible(NULL) 
##  } 
##  if (!any(class(x) == "BsProb")) 
##   return("\nArgument `x' should be class BsProb. Output of corresponding function.") 
##  ifelse(x$INDGAM == 0, prob <- as.matrix(x$sprob), prob <- x$prob) 
##  if (code) 
##   rownames(prob) <- rownames(x$prob) 
##  else rownames(prob) <- names(x$sprob) 
##  spikes(prob, ...) 
##  if (prt) 
##   summary.BsProb(x) 
##  invisible(NULL) 
## } 
## <environment: namespace:BsMD> 

展望上面的代碼中,我們可以看到,它動態地定義了spikes()功能,並調用它靠近身體的末端。 spikes()函數調用plot()並無條件地傳遞參數xlab='factors',以及從頂級調用中繼傳送的...可變參數。這就是爲什麼有兩個xlab實際參數匹配xlab正式論證;一個來自spikes()詞法參數列表,另一個來自...中繼。

因此,不幸的是,無法從頂層調用中通過xlab而沒有與實現衝突。你運氣不好。你可以給BsMD包的維護者寫一封措辭強烈的信件,要求他們使BsMD:::plot.BsProb()函數更加靈活,同時只需咬緊牙關,利用黑客來解決這個限制,就像@ fdetsch的出色建議。