更改do.call中的绘图标题

时间:2013-08-02 07:23:50

标签: r graphics cross-correlation do.call

my.ccf函数生成一个情节。

my.ccf <- function(dat)
{
require(forecast)
modx <- auto.arima(dat[,1])
modx$series <- colnames(dat)[1]
mody <- Arima(dat[,2], model=modx)
mody$series <- colnames(dat)[2]
ccf1 <- ccf(residuals(modx), residuals(mody), type="correlation", ylab="CCF", 
            main=paste(colnames(dat)[1], "&", colnames(dat)[2], sep=" "))
return(list(modx=modx, mody=mody, ccf=ccf1))    
}
dat1 <- data.frame(p=rnorm(50), q=rnorm(50)); my.ccf(dat1) 

制作的数字有'p&amp; x'等作为标题

我在函数year.ccf中使用do.call在另一个data.frame(dat2)上应用此函数。首先,它将按年分配传递的data.frame(我有单独的函数来执行此操作。为了说明的目的,我在这里使用for循环)然后将my.ccf应用于名为'x'的列的配对组合与给定的列在var.do. var.do的长度从3到9不等。我必须在不同的数据帧上重复多次(超过500次)并尝试尽可能自动。

year.ccf1 <- function(dat, var.do=c('a','b'))
{
year.form <- format(dat2$date, '%Y')
dat$year <- factor(year.form, levels=unique(year.form), ordered=TRUE)
yl <- levels(dat$year)
ydat <- list()
for(i in 1:length(yl))
ydat[[i]] <- subset(dat,year==yl[i])
wdat <- list()
for(i in 1:length(yl)){  
a <- list()
for(j in 1:length(var.do)){
#par(mfrow=c(2,2))
a[[j]] <- do.call(my.ccf, list(ydat[[i]][,eval(c(var.do[j],'x'))]))
}
names(a) <- var.do
wdat[[i]] <- a         
}
names(wdat) <- yl
return(wdat)
}
date <- seq(as.Date("2011/1/1"), as.Date("2013/8/1"),  by = "months")
dat2 <- data.frame(date=date,x =rnorm(length(date)), y=rnorm(length(date)),        
a=rnorm(length(date)),b=rnorm(length(date)))
pdf("./temp/dat2.pdf")
A <- year.ccf1(dat2, var.do=c('a', 'b'))
dev.off()

我正在尝试更改dat2.pdf中每个绘图的标题,使其具有列名称的年份标记,例如“2011年:和&amp; x的CCF”。不确定我是否遗漏了明显的东西或者不明白如何在一个do.call中进行论证,如下所示。

do.call(my.ccf, main=paste("Year ", yl[i], var.do[j], " & x", sep=" "), list(ydat[[i]
[,eval(c(var.do[j],'x'))]))

还尝试在一个页面中放置多个绘图以使pdf文件更小。我尝试用par(mfrow)(取消注释)来处理第二个问题但是失败了。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我认为你应该首先给my.ccf一个额外的论点。例如:

my.ccf <- function(dat,year=NA)
{
   ...
  title=paste(colnames(dat)[1], "&", colnames(dat)[2], sep=" ")
  if(!is.na(year))
    title <- paste('Year', year,': CCF',title)
  ccf1 <- ccf(residuals(modx), ..., main=title)
  .....
}

然后您将do.call更改为以下内容:

 do.call(my.ccf, list(dat=list(ydat[[i]][,eval(c(var.do[j],'x'))]),year=i))

那说'认为你的year.ccf1功能过于复杂而且效率极低。尝试使用outermapply重写它。

year.ccf1 <- function(dat, var.do=c('a','b'))
{
  dat$year <- factor(format(dat$date, '%Y'))
  ydat <- split(dat,dat$year)
  outer(names(ydat),var.do,function(x,y)
    Map(function(i,j)
        do.call(my.ccf, list(dat=ydat[[i]][,c(j,'x')],year=i))
           ,x,y)
  )
}