“形式论证”foo“由多个参数匹配” - 如何在R中处理这个问题?

时间:2013-07-15 08:59:42

标签: r function plot arguments

有时,使用某些参数调用函数会导致错误消息formal argument "foo" matched by multiple actual arguments。是否可以打印不明确的实际参数列表?

我问这个问题的原因是plot函数对mixEM类对象的问题(由normalmixEM包中的mixtools生成)。它不接受引发上述错误的参数ylim,但当我尝试使用ylim2时(xlab2main2col2的工作方式它等,"ylim2" is not a graphical parameter。所以我想知道ylim匹配的实际参数是什么?

使用formals(plot.mixEM)没有帮助,因为它不包含以ylim开头的任何内容,但最后它引用...这是传递给{{的图形参数1}}。但是,对于plot函数,plot将是明确的。从ylim获取更准确的错误描述以及相互冲突的参数列表会很有帮助。

UPD:MWE:

R

这会产生错误:

library(mixtools)
wait = faithful$waiting
mixmdl = normalmixEM(wait)
plot(mixmdl, which = 2, xlim = c(25, 110), nclass=20)
lines(density(wait), lty = 2, lwd = 2)

这根本不起作用:

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`

2 个答案:

答案 0 :(得分:8)

您的问题主要是类型:

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

因为你的 ylim -definition被传递给带有“...” - 参数的绘图函数,在 plot.mixEM 的以下行中:

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

虽然 ylim 已定义为以下上限:

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

请注意,您正在为 mixEM 类型的对象调用绘图函数。查看默认绘图函数 plot.default 的代码会让您感到困惑,因为它实际上是您正在调用的 plot.mixEM 。如果在终端中键入 plot.mixEM ,您将看到其代码,?plot.mixEM 也会帮助您。这是R中的典型方法,其中默认函数 functionname.default 由包提供的类特定函数替换,格式为 functionname.classname

你有几个选择:

  1. 通过替换中的硬编码部分来编写自己的 plot.mixEM 原始功能,你只需要换几行。
  2. plot.mixEM 之前绘制窗口并添加“ add = TRUE ”参数,这意味着我们不会创建新的绘图窗口,而是添加到现有的。
  3. 这是选项2的工作原理:

    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

答案 1 :(得分:2)

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

错误消息非常有用。它告诉您哪个函数传递参数两次。有关更多信息:

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)

因此,hist中的plot.mixEM已拨打ylim = c(0,maxy)。您的ylim = c(0,0.5)通过省略号(...)传递,以便hist.default两次通过ylim。因此,错误。