“Formal argument ”foo“ matched by multiple arguments” - how to deal with this in R?

前端 未结 2 962
清酒与你
清酒与你 2021-02-07 11:37

Sometimes, calling a function with certain arguments results in the error message formal argument \"foo\" matched by multiple actual arguments. Is it possible to pr

相关标签:
2条回答
  • 2021-02-07 11:41
    library(mixtools)
    wait = faithful$waiting
    mixmdl = normalmixEM(wait)
    
    plot(mixmdl, which = 2, xlim = c(25, 110), ylim = c(0, .5), nclass=20)
    #Error in hist.default(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0,  : 
    #  formal argument "ylim" matched by multiple actual arguments
    

    The error message is quite informative. It tells you which function gets passed the parameter twice. For more information:

    traceback()
    
    # 4: hist.default(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0, 
    #                                                                      maxy), ...)
    # 3: hist(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0, 
    #                                                              maxy), ...)
    # 2: plot.mixEM(mixmdl, which = 2, xlim = c(25, 110), ylim = c(0, 
    #                                                              0.5), nclass = 20)
    # 1: plot(mixmdl, which = 2, xlim = c(25, 110), ylim = c(0, 0.5), 
    #         nclass = 20)
    

    So, there is a call to hist in plot.mixEM that already sets ylim = c(0,maxy). Your ylim = c(0,0.5) gets passed via the ellipsis (...), so that hist.default gets passed ylim twice. Hence, the error.

    0 讨论(0)
  • 2021-02-07 12:08

    Your problem is essentially of type:

    plot(1:10, rnorm(10), ylim=c(0,1), ylim=c(-1,100))
    Error in plot.default(1:10, rnorm(10), ylim = c(0, 1), ylim = c(-1, 100)) : 
      formal argument "ylim" matched by multiple actual arguments
    

    because your ylim-definition gets passed on to a plot function with the "..."-argument, in the following line of plot.mixEM:

    hist(x, prob = TRUE, main = main2, xlab = xlab2, ylim = c(0, maxy), ...)
    

    while ylim has been defined with the following upper limit:

    maxy <- max(max(a$density), 0.3989 * mix.object$lambda/mix.object$sigma)
    

    Notice that you are calling plotting function for an object of type mixEM. Looking at the code of the default plotting function plot.default will leave you puzzled, as it is actually plot.mixEM that you are calling. If you type plot.mixEM in the terminal you will see its code, and ?plot.mixEM will help you out as well. This is a typical approach in R, where the default function functionname.default is replaced by a class-specific function provided by the package in the format functionname.classname.

    You got couple options:

    1. Write your own plot.mixEM by replacing the hard-coded part in the original function, you only need to change couple lines.
    2. Plot the window before plot.mixEM and add the "add=TRUE" parameter, which means that we will not create a new plotting window but instead add to the existing one.

    This is how option 2 works:

    library(mixtools)
    wait = faithful$waiting
    mixmdl = normalmixEM(wait)
    plot.new()
    plot.window(xlim=c(25,110), ylim=c(0,0.5))
    plot(mixmdl, which = 2, nclass=20, add = TRUE)
    lines(density(wait), lty = 2, lwd = 2)
    box(); axis(1); axis(2); title(xlab="Data", ylab="Density")
    

    Example plot

    0 讨论(0)
提交回复
热议问题