"形式参数" foo"由多个参数匹配" -在R中如何处理? [英] "Formal argument "foo" matched by multiple arguments" - how to deal with this in R?

查看:313
本文介绍了"形式参数" foo"由多个参数匹配" -在R中如何处理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有时,使用某些参数调用函数会导致错误消息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

解决方案

您的问题本质上是类型:

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

因为在 plot.mixEM 的以下行中,您的 ylim 定义将传递给带有"..."参数的绘图函数:

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")

Sometimes, calling a function with certain arguments results in the error message formal argument "foo" matched by multiple actual arguments. Is it possible to print the list of the ambiguous actual arguments?

The reason I'm asking this is currently a problem with the plot function for objects of class mixEM (generated by normalmixEM from the mixtools package). It doesn't accept the argument ylim yielding the error above, but when I try to use ylim2 (the way it works for xlab2, main2, col2 etc.), it says "ylim2" is not a graphical parameter. So I wonder what are the actual arguments that are matched by ylim?

Using formals(plot.mixEM) doesn't help because it doesn't contain anything starting with ylim, but then at the end it refers to ... which are the graphical parameters passed to plot. However, for the plot function, ylim would be unambiguous. Getting a more exact error description from R with a list of the conflicting arguments would be helpful.

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)

This produces an error:

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`

This simply doesn't work:

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

解决方案

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")

这篇关于&quot;形式参数&quot; foo&quot;由多个参数匹配" -在R中如何处理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆