2013-08-09 1 views
2

Я делаю приложение, которое позволяет пользователю загружать любой файл csv, и приложение будет отображать его. Я хотел бы разрешить пользователю переключаться между стилями графа, gVis и ggplot. Графики работают как реализованные сами по себе, но я не могу понять, как включить пользователя для переключения их с помощью checkboxInput (input $ switchLine). Я отправлю только пример кода относительно проблемы под рукой, дайте мне знать, если вам нужна дополнительная информация.Как включить пользователя для переключения между графиками ggplot2 и gVis в R Shiny?

Я пробовал такие вещи, как сервер:

if (input$switchLine) { 
    output$gvisLine 
} else { 
    output$plotLine 
} 

Но проблема в том, что в ui.R, ggplot линия использует plotOutput в то время как gVis использует HTML вывода.

ui.R (я закомментировать строку gVis как я только знаю, как построить один в то время, прямо сейчас)

library(shiny) 

dataset <- list('Upload a file'=c(1)) 

shinyUI(pageWithSidebar(

    headerPanel(''), 

    sidebarPanel(
    wellPanel(
     selectInput('xLine', 'X', names(dataset)), 
     selectInput('yLine', 'Y', names(dataset), multiple=T) 
    ), 
    wellPanel(
     checkboxInput('switchLine', 'Switch to gVis') 
    ) 
), 
    mainPanel( 
    tabPanel("Line Graph", plotOutput('plotLine', height="auto"), value="line"), 
    #Below is the gvis Line   
    #tabPanel("Line Graph", htmlOutput("gvisLine"), value="line") 

) 
)) 

server.R

library(reshape2) 
library(googleVis) 
library(ggplot2) 
library(plyr) 
library(scales) 
require(xlsx) 
require(xlsxjars) 
require(rJava) 
require(shiny) 

options(shiny.maxRequestSize=-1) 

shinyServer(function(input, output, session) { 

if (is.null(input$file)) 
     return(NULL) 
    else if (identical(input$format, 'CSV')) 
     return(read.csv(input$file$datapath)) 
    else if (identical(input$format, 'XLSX')) 
     return(read.xlsx2(input$file$datapath, input$sheet)) 
    else 
     return(read.delim(input$file$datapath)) 
}) 

observe({ 
    df <- data() 
    str(names(df)) 

    updateSelectInput(session, 'xLine', choices = names(df)) 
    updateSelectInput(session, 'yLine', choices = names(df)) 
} 
}) 

output$gvisLine<- renderGvis({ 
    tempX <- input$xLine 
    tempY <- input$yLine 
    if (is.null(data())) 
     return(NULL) 
    if (is.null(tempY)) 
     return(NULL) 

    gvisLineChart(data(),xvar=tempX,yvar=tempY, 
        options=list(
        title=paste("",tempX," VS ",tempY,""), 
        titlePosition='out', 
        hAxis="{slantedText:'true',slantedTextAngle:45}", 
        titleTextStyle="{color:'black',fontName:'Courier'}", 
        legend="{color:'black',fontName:'Courier'}", 
        fontSize="10", 
        chartArea="{left:40,top:30,width:'90%',height:'85%'}",    
        height=700, width=1100)) 

    }) 

    output$plotLine <- renderPlot(height=650, units="px", { 

    tempX <- input$xLine 
    tempY <- input$yLine 

    if (is.null(data())) 
     return(NULL) 
    if (is.null(tempY)) 
     return(NULL) 

    widedata <- subset(data(), select = c(tempX, tempY)) 
    melted <- melt(widedata, id = tempX) 
    p <- ggplot(melted, aes_string(x=names(melted)[1], y="value", group="variable", color="variable")) + geom_line() + geom_point() 
    p <- p + opts(axis.text.x=theme_text(angle=45, hjust=1, vjust=1)) 
    p <- p + labs(title=paste("",tempX," VS ",tempY,"")) 

    print(p) 


    }) 
}) 

ответ

4

Используйте

conditionalPanel(
         condition = "input.switchLine == false", 
         plotOutput('plotLine', height="auto") 
        ), 
        conditionalPanel(
         condition = "input.switchLine == true", 
         htmlOutput("gvisLine") 
        ) 

или что-то подобное в ui.R

+0

Я пробовал это раньше и получил ошибку, потому что мне нужно использовать tabPanels (я только поместил небольшой образец моего общего кода). Когда я пытаюсь нарисовать код, который вы поставили выше, с помощью tabPanels, я получаю аргумент с нулевой ошибкой. – user2522217

+0

Кажется, работает для меня внутри tabPanels ([например] (https://gist.github.com/jcheng5/9bb8f87fc58deb15720b)). Если у вас есть (минимальный) воспроизводимый пример, пожалуйста, опубликуйте его! –