"形式参数" foo"由多个参数匹配" -在R中如何处理? [英] "Formal argument "foo" matched by multiple arguments" - how to deal with this in R?
问题描述
有时,使用某些参数调用函数会导致错误消息formal argument "foo" matched by multiple actual arguments
.可以打印出模棱两可的实际参数列表吗?
我要问的原因当前是plot
函数针对类mixEM
(由normalmixEM
从mixtools
包生成的)对象的问题.它不接受参数ylim
产生上面的错误,但是当我尝试使用ylim2
(它对xlab2
,main2
,col2
等的工作方式)时,它说"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 . >
您有几个选择:
-
通过替换硬盘中的硬编码部分,
- 编写您自己的 plot.mixEM 原始功能,只需更改几行即可.
- 在 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:
- Write your own plot.mixEM by replacing the hard-coded part in the original function, you only need to change couple lines.
- 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")
这篇关于"形式参数" foo"由多个参数匹配" -在R中如何处理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!