【问题标题】:Oddity with MoreArgs in mapply() - passing multiple values of an argumentmapply() 中 MoreArgs 的奇怪之处 - 传递参数的多个值
【发布时间】:2012-05-20 19:36:31
【问题描述】:

昨天,我向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))

这一切都很好。但是,我试图将此代码包装在一个函数中,并且我希望能够输入一个可选参数列表,然后可以将其传递给 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))

【问题讨论】:

    标签: r


    【解决方案1】:

    这是解决此类问题的一般方法。您应该能够对其进行调整以更准确地执行您想要的操作:

    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)
    

    【讨论】:

    • 感谢您连续两天帮助我!您发布的脚本很棒。通过修改它,我能够简化我正在处理的函数中的其他一些事情。 :)
    • @X.He 超级。您清晰的问题和可重复的示例使您乐于提供帮助。
    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多