2016-08-24 13 views
0

我對R相當陌生,希望有人能夠在下面的代碼中向我解釋2件事。R - Mapply功能創建和PDF繪圖/ ggplots

  1. 爲什麼我需要雙括號{{圍繞劇情讓它錄製劇情才能重播呢?然後在replayPlot中需要雙方括號[[
  2. 爲什麼我不可以在mapply中使用$表示法?它在它之外工作。在適當的R工作中使用$是不是很糟糕?

我的真實代碼大得多,所以認爲最好能讓應用程序工作。

library(ggplot2) 
library(gridExtra) 

TDSF <- data.frame(Graduation=sample(1950:2010, 30,replace=TRUE), 
        Donation=sample(10:50000, 30,replace=TRUE), 
        Start.Year=sample(1950:2010,30,replace=TRUE), 
        State=sample(state.abb,30,replace=TRUE)) 
TDSF$Graduation <- as.numeric(as.character(TDSF$Graduation)) 
TDSF$Start <- as.numeric(as.character(TDSF$Start)) 

plots2 <- mapply(function(nm,df.year,df.bracket_5,df.bracket_10) list(
    {{plot(-1:1,-1:1,type="n",xaxt="n",yaxt="n",ann=FALSE)+ 
     text(0,0,paste("Analysis by",nm,"Year"),cex=2) 
    recordPlot()}}, 
    {ggplot(data=TDSF, aes_(x=as.name(nm))) + geom_histogram(color="red",binwidth = 1,boundary=-.01)}, 
    {ggplot(data=TDSF, aes_(x=as.name(nm))) + geom_histogram(color="red",binwidth = 5,boundary=-.01)} 
),c("Graduation","Start"),SIMPLIFY = FALSE) 

replayPlot(plots2$Graduation[[1]]) #use $ notation 
do.call(grid.arrange,plots2$Graduation[2:3])`#use $ notation 

mapply(function(nm) 
    {pdf(file=paste(nm,"test.pdf")) 
    replayPlot(plots2[[nm]][[1]]) #use [[]][[]] 
    do.call(grid.arrange,c(plots2[[nm]][2:3],ncol=1)) #use [[]][[]] 
    dev.off()} 
,c("Graduation","Start")) 

回答

1

讓我重新格式化您的代碼位:

library(ggplot2) 
library(gridExtra) 
TDSF <- data.frame(Graduation=sample(1950:2010, 30,replace=TRUE), 
        Donation=sample(10:50000, 30,replace=TRUE), 
        Start.Year=sample(1950:2010,30,replace=TRUE), 
        State=sample(state.abb,30,replace=TRUE)) 
TDSF$Graduation <- as.numeric(as.character(TDSF$Graduation)) 
TDSF$Start <- as.numeric(as.character(TDSF$Start)) 

plots2 <- mapply(function(nm,df.year,df.bracket_5,df.bracket_10) list(
    {plot(-1:1,-1:1,type="n",xaxt="n",yaxt="n",ann=FALSE)+ 
     text(0,0,paste("Analysis by",nm,"Year"),cex=2) 
    recordPlot()}, 
    {ggplot(data=TDSF, aes_(x=as.name(nm))) + geom_histogram(color="red",binwidth = 1,boundary=-.01)}, 
    {ggplot(data=TDSF, aes_(x=as.name(nm))) + geom_histogram(color="red",binwidth = 5,boundary=-.01)} 
),c("Graduation","Start"),SIMPLIFY = FALSE) 

plots2 

replayPlot(plots2$Graduation[[1]]) #use $ notation 
n <- length(plots2) 
nCol <- floor(sqrt(n)) 
do.call("grid.arrange",c(plots2$Graduation[2:3], ncol=nCol)) #use $ notation 


replay <- function(nm) { 
    pdf(file = paste(nm,"test.pdf")) 
    replayPlot(plots2[[nm]][[1]]) #use [[]][[]] 
    do.call(grid.arrange,c(plots2[[nm]][2:3],ncol = 1)) #use [[]][[]] 
    dev.off() 
} 

mapply(replay ,c("Graduation","Start")) 
  1. 你並不需要雙括號

雙用方括號按順序訪問元素。 plots2是一個相對複雜的結構,並有訪問它的元素很多方面

plots2$Graduation[[1]] is equivalent to plots2[[1]][[1]] for example 
  • 是不相關的mapply,但你可以在功能重播看到(我已經添加了$ )它是由於在運行時對nm變量的R解釋造成的。 nm是一個變量,你不能使用$ nm的圖(你將不得不使用一些eval函數讓R理解你真正的意思)