17

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

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

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

更新: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
4

2 回答 2

9

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

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 ”参数,这意味着我们不会创建新的绘图窗口,而是添加到现有的窗口中。

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

示例图

于 2013-07-15T10:12:20.150 回答
4
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)

因此,已经设置了对histin的调用。您通过省略号 ( ) 传递,因此传递两次。因此,错误。plot.mixEMylim = c(0,maxy)ylim = c(0,0.5)...hist.defaultylim

于 2013-07-15T09:49:32.657 回答