【问题标题】:"Formal argument "foo" matched by multiple arguments" - how to deal with this in R?“由多个参数匹配的形式参数“foo”” - 如何在 R 中处理这个问题?
【发布时间】:2013-07-13 02:06:12
【问题描述】:

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

我问这个问题的原因目前是plot 类对象的mixEM 函数存在问题(由normalmixEMmixtools 包生成)。它不接受产生上述错误的参数ylim,但是当我尝试使用ylim2(它适用于xlab2main2col2 等的方式)时,它说"ylim2" is not a graphical parameter .所以我想知道ylim匹配的实际参数是什么?

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

UPD:MWE:

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`

这根本行不通:

plot(mixmdl, which = 2, xlim = c(25, 110), ylim2 = c(0, .5), nclass=20)

# Warning messages:
# 1: In title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...) :
#   "ylim2" is not a graphical parameter
# 2: In axis(1, ...) : "ylim2" is not a graphical parameter
# 3: In axis(2, ...) : "ylim2" is not a graphical parameter

【问题讨论】:

  • 添加产生错误的代码比叙述方式更容易...
  • @agstudy 我添加了一个 MWE。但是,我也希望就如何处理此类错误提供一般性建议,因为这不是我第一次也可能不是最后一次遇到此类问题。
  • 仅供参考 - 如果您不小心将参数添加到函数调用两次,也会发生此错误。

标签: r function plot arguments


【解决方案1】:

您的问题本质上属于以下类型:

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 定义被传递给带有“...”参数的绘图函数,在 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 格式提供的特定于类的函数替换。 p>

你有几个选择:

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

这就是选项 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")

【讨论】:

    【解决方案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)
    

    所以,在 plot.mixEM 中有一个对 hist 的调用,它已经设置了 ylim = c(0,maxy)。您的 ylim = c(0,0.5) 会通过省略号 (...) 传递,因此 hist.default 会通过 ylim 两次。因此,错误。

    【讨论】:

    • 好的,谢谢。但是为什么我的调用中的ylim 没有覆盖plot.mixEM 设置的默认值?我怎样才能改变它?
    • 因为省略号。定义您自己的绘图函数(从plot.mixEM 复制代码并将ylim=c(0,maxy) 从对hist 的违规调用中删除)。
    • 谢谢,我想我明白了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多