在mapply()中使用MoreArgs的奇怪 - 传递参数的多个值

时间:2012-05-20 19:36:31

标签: r

昨天,我问question关于如何绘制多条(水平线)线,每条线都有用户指定的颜色,而不使用循环。

我尝试使用建议的函数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

1 个答案:

答案 0 :(得分: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

相关问题