如何将参数传递给另一个函数中调用的函数?

时间:2013-01-25 16:48:36

标签: r

我正在使用孤立的R库(wmtsa)。其中一个函数创建了一个连续的小波变换(wavCWT()),它返回一个小波对象,可以通过调用传统的plot()函数来绘制它。不幸的是,写入函数的方式不允许我改变一些典型的绘图参数。特别是,我无法设置axes=F,我不得不一直绘制轴。这没有用,因为我想为我的设备添加额外的图层,并且轴是不同的,它们是偏移的。

有没有办法将参数传递给调用plot()函数的方法?

如果无法做到这一点,恐怕我将不得不修改源代码。如果是这种情况,我应该在哪里修改这种对象的方法?

我找到了source方法,但我的黑客技能有限,我有点迷失。

示例:

 library(wmtsa)   # assuming you have installed the package wmtsa
 wavCWT(sin(rnorm(1000)))
 plot(W, power.stretch=0.5)

产生这个情节:

enter image description here

但如果我尝试使用axes=F删除轴,我会收到以下消息:

plot(W, power.stretch=0.5, axes=F)
Error in plot.default(NA, NA, xlim = xlim, ylim = ylim, type = "n", xaxs = xaxs,  : 
formal argument "axes" matched by multiple actual arguments

3 个答案:

答案 0 :(得分:2)

您确实需要更改来源,但只是非常轻微。在wav_xform.R的第269-270行,plot.wavCMT函数内部更改了行:

image(data$x, data$y, imageScale(data$z, power.stretch=power.stretch), ...,
  xlab=xlab, ylab=ylab, axes=TRUE)

image(data$x, data$y, imageScale(data$z, power.stretch=power.stretch), ...,
  xlab=xlab, ylab=ylab)

原因是省略号(...) - 表示“对plot函数进行任何额外的参数并将它们传递给image函数”。但是,原始代码也有axes=TRUE,这意味着如果您尝试通过axes=FALSE,则会出现formal argument "axes" matched by multiple actual arguments错误。

然后(重新安装后),以下工作可以摆脱轴:

library(wmtsa)
sunspots.cwt <- wavCWT(sunspots)
plot(sunspots.cwt)  # has axes
plot(sunspots.cwt, axes=FALSE)  # does *not* have axes

另请注意,可以更改其他常见的绘图参数,这要归功于省略号! (即使您从未修改过源,也是如此)。例如:

plot(sunspots.cwt, main="My great wavelet plot")  # change title
plot(sunspots.cwt, xlim=c(1750, 1850))  # change x axis range
plot(sunspots.cwt, ylim=c(0, 2))  # change y axis range

答案 1 :(得分:2)

wmtsa 包专门为类plot的对象定义wavCWT方法。因为它是一个S3方法,所以它被称为plot.wavCWT,但它被声明为不可见,如此命令所示(在加载包之后):

methods(plot)

默认情况下,使用R,只需键入不带括号的名称即可获得函数的来源。但它在这里不起作用,因为该功能是不可见的。所以你必须这样做:

getAnywhere(plot.wavCWT)

您可以做的一件事是复制源代码,然后使用以下命令重新定义函数:

plot.wavCWT <- function (x, xlab = NULL, ylab = NULL, logxy = "y", power.stretch = 0.5, 
phase = FALSE, series = FALSE, series.ylab = "", zoom = NULL, 
type = "image", grid.size = 100, add = FALSE, theta = 120, 
phi = 30, ...) {
    ...paste your original code here...
}

然后您可以根据需要修改原始代码并执行函数定义以使其可用于您的脚本。

我不完全确定您需要修改以满足您的需求,但函数定义中有以下块:

        plot(series.time, x.series[itime], type = "l", col = "blue", 
            axes = TRUE, xlim = range(series.time), ylab = series.ylab, 
            xlab = "", xaxt = "n", xaxs = "i")

然后,您可以将axes=TRUE更改为axes=FALSE,或者更好的是,在您的函数定义中添加参数plotaxes=TRUE,然后将axes=TRUE更改为axes=plotaxes

答案 2 :(得分:0)

快速解决方案,无需更改功能代码:

x=seq(1:10)
y=x
plot(x,y,ylab="unwanted y label",xlab="x")
mtext("unwanted y label", side=2, line=3, col="white", cex=1)
mtext("my new y label", side=2, line=3, col=1, cex=1)

上面的代码将以前的y标签写成白色,然后用所需的标签替换标签。