2012-05-20 66 views
2

昨天,我問了一個question關於如何繪製多條(水平線),每條線都帶有用戶指定的顏色,而不使用循環。mapply中使用MoreArgs的奇怪() - 傳遞多個參數的值

我試圖使用建議的函數matplot()來繪製下面的圖中顯示的短垂直線和相關的代碼。

ci = matrix(1:30, nrow=3, byrow=T) 
    ci=list(rbind(ci[1,], ci[1,]+2), 
      rbind(ci[2,], ci[2,]+2), 
      rbind(ci[3,], ci[3,]+2)) 
    x = rbind(1:10, 1:10) 
    plot(-5, xlim=c(1,10), ylim=c(1,32)) 
    invisible(mapply(matlines, x=list(x), y=ci, 
       col=c("red","blue","black"), 
       lty = 1)) 

Plot 1: Desired plot

這是所有好。但是,我試圖將這些代碼封裝在一個函數中,我希望能夠輸入一個可選參數列表,然後可以將其傳遞給mapply/matlines。我試圖在mapply()中使用參數MoreArgs無濟於事。似乎MoreArgs所採用的論點與其他論壇不一樣。正如您在第一個代碼中看到的,列表中的每個項目都會獲得不同的顏色,但是當我將col放入列表args.ci中時,3種顏色將在列表中的每個項目內循環。我想知道是否有解決這個問題,如果我有一個參數的多個值,每個值被應用到列表中的一個項目。謝謝!

args.ci = list(col=c("red","blue","black"), lty=1:3) 
    plot(-5, xlim=c(1,10), ylim=c(1,32)) 
    invisible(mapply(matlines, x=list(x), y=ci, 
       MoreArgs = args.ci)) 

Plot 2: Not what I want

回答

5

下面是這類問題的一般方法。您應該能夠適應它做更多你想要什麼:

myFun <- function(...) { 
    fixedArgs <- list(matlines, x=list(x), y=ci) 
    dots <- list(...) 
    allArgs <- c(fixedArgs, dots) 
    plot(-5, xlim=c(1,10), ylim=c(1,32)) 
    invisible(do.call(mapply, allArgs)) 
} 

myFun(col=c("red","blue","black"), lty=1) 

enter image description here

+0

謝謝你幫我兩天時間在一排!您發佈的腳本非常棒。通過修改它,我能夠簡化我正在使用的函數中的其他一些內容。 :) – Alex

+0

@ X.He超級。你清楚的問題和可重複的例子使它很樂意提供幫助。 –