2012-05-20 40 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超级。你清楚的问题和可重复的例子使它很乐意提供帮助。 –