2016-10-28 5 views
0

Мой код для построения сложной пирамиды хорошо работает в окне терминала, но он вызывает ошибку, когда внутри функции.Ошибка при построении графика в функции с ggplot2

Вот мой код:

make.pyramid <- function(){ 
    mydata <- data.frame(factorname=rep(c("first","second"),10), Topic=sort(c(1:10, 1:10)), Distribution=sample(1:200,20)) 
    mydata <- mydata[order(mydata$factorname,mydata$Topic),] 
    topicavg <- c() 
    for (row in 1:10) {topicavg[row] <- mydata[row,3]-mydata[row+10,3]} 
    topicavg <- c(topicavg,topicavg) 
    mydata <- cbind(mydata,topicavg) 
    library(ggplot2) 
    dist <- ggplot(data=mydata, aes_q(x=substitute(reorder(Topic, topicavg)), y=quote(Distribution), fill=as.name("factorname"))) 
    dist <- dist + geom_bar(data=subset(mydata,mydata[,1]=="first"), stat="identity") 
    dist <- dist + geom_bar(data=subset(mydata,mydata[,1]=="second"), stat="identity", position="identity", mapping=aes(y=-Distribution)) 
    dist <- dist + scale_y_continuous(labels=abs) 
    dist <- dist + xlab("Topics") 
    dist <- dist + coord_flip() 
    dist <- dist + geom_point(data=subset(mydata,mydata[,1]=="second"), mapping=aes(y=topicavg), shape=4, show.legend = F) 
    print(dist) 
} 

Если я пошагово строка за строкой в ​​терминале, я получаю сюжет так: stacked pyramid chart

Но при использовании этой функции, я получаю следующее ошибка:

Error in tapply(X = X, INDEX = x, FUN = FUN, ...) : arguments must have same length

Где я ошибся, и как я исправлю это?

ответ

2

Да, другое решение создать раздельные функции

makeData <- function() { 
    makingData <- data.frame(factorname=rep(c("first","second"),10), Topic=sort(c(1:10, 1:10)), Distribution=sample(1:200,20)) 
    makingData <- makingData[order(makingData$factorname,makingData$Topic),] 
    topicavg <- c() 
    for (row in 1:10) {topicavg[row] <- makingData[row,3]-makingData[row+10,3]} 
    topicavg <- c(topicavg,topicavg) 
    makingData <- cbind(makingData,topicavg) 
    return(makingData) 
} 

make.pyramid <- function(){ 
    myData <- makeData() 
    dist <- ggplot(data=mydata, aes_q(x=substitute(reorder(Topic, topicavg)), y=quote(Distribution), fill=as.name("factorname"))) 
    dist <- dist + geom_bar(data=subset(mydata,mydata[,1]=="first"), stat="identity") 
    dist <- dist + geom_bar(data=subset(mydata,mydata[,1]=="second"), stat="identity", position="identity", mapping=aes(y=-Distribution)) 
    dist <- dist + scale_y_continuous(labels=abs) 
    dist <- dist + xlab("Topics") 
    dist <- dist + coord_flip() 
    dist <- dist + geom_point(data=subset(mydata,mydata[,1]=="second"), mapping=aes(y=topicavg), shape=4, show.legend = F) 
    print(dist) 
} 
+0

Это чище. Благодаря! –

0

Я понял! Мое убеждение, что я столкнулся с проблемой ggplot2, отбросило меня с трассы. Я использовал функцию неправильно. В этом примере, мне нужно определить свои объекты во всем мире, даже просто использовать его локально в пределах функции:

make.pyramid <- function(){ 
    mydata <<- data.frame(factorname=rep(c("first","second"),10), Topic=sort(c(1:10, 1:10)), Distribution=sample(1:200,20)) 
    mydata <<- mydata[order(mydata$factorname,mydata$Topic),] 
    topicavg <<- c() 
    for (row in 1:10) {topicavg[row] <- mydata[row,3]-mydata[row+10,3]} 
    topicavg <<- c(topicavg,topicavg) 
    mydata <<- cbind(mydata,topicavg) 
    dist <- ggplot(data=mydata, aes_q(x=substitute(reorder(Topic, topicavg)), y=quote(Distribution), fill=as.name("factorname"))) 
    dist <- dist + geom_bar(data=subset(mydata,mydata[,1]=="first"), stat="identity") 
    dist <- dist + geom_bar(data=subset(mydata,mydata[,1]=="second"), stat="identity", position="identity", mapping=aes(y=-Distribution)) 
    dist <- dist + scale_y_continuous(labels=abs) 
    dist <- dist + xlab("Topics") 
    dist <- dist + coord_flip() 
    dist <- dist + geom_point(data=subset(mydata,mydata[,1]=="second"), mapping=aes(y=topicavg), shape=4, show.legend = F) 
    print(dist) 
} 
Смежные вопросы