2013-01-25 3 views
2

Я использую сиротскую библиотеку 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 
+2

Название немного вводит в заблуждение. Реальный вопрос (я думаю): «Как вы передаете аргументы функции, называемой внутри другой функции?» И общий ответ: убедитесь, что родительская функция написана правильно, чтобы разрешить это :-(. –

ответ

2

Вы делаете нужно изменить источник, но только очень немного. На линии 269-270 из wav_xform.R, внутри функции 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 
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.

+1

Нет необходимости добавлять аргумент 'plotaxes'. Пока« axes = TRUE »удаляется (см. Мой ответ) вы можете просто сделать 'axes = FALSE' право на функцию графика без каких-либо дополнительных изменений, благодаря эллипсису. –

+0

Да, вы правы, но я применил« plotaxes »к неправильной функции. – juba

+0

Спасибо за ваше предложение Джуба , трюк использования 'getAnywhere()', а затем добавить это в мою библиотеку функций, облегчивших мою жизнь. +1 – pedrosaurio

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) 

Приведенный выше код записывается поверх предыдущего у метки в белом, а затем заменяет этикетку с требуемым этикетке.

Смежные вопросы