2015-01-27 4 views
4

Я пытаюсь использовать Блестящая и ggvis к:Создание динамических ggvis диаграммы из загруженного файла в блестящей

1) загрузить набор данных

2) имеют пользователю выбрать 2 колонки (х, у)

3) возвращают ggvis участок отображения (х, у) из выгружаемых набора данных

Я попытался редактирования примеров со страницы Блестящая Interactivity, а также movie explorer пример. Однако диаграмма не отображается.

Я думаю, что моя проблема заключается в загрузке набора данных, но я не знаю с чего начать ... Любые предложения?

Примечание. Я также пробовал это с помощью rCharts, но у меня возникают аналогичные проблемы, когда диаграмма не отображается.

server.R

library(shiny) 
library(dplyr) 
library(ggvis) 

shinyServer(function(input, output, session) { 

fileHeaderNames <- reactive({ 

    infile <- input$datfile 

    if(is.null(infile)) 
    return(NULL) 

    d <- read.csv(infile$datapath, header = T) 
    return(names(d)) 

}) 

# dynamic variable names 
observe({ 

    updateSelectInput(session, 'x', choices = fileHeaderNames()) 
    updateSelectInput(session, 'y', choices = fileHeaderNames()) 

}) # end observe 

    # uploading data set 
    theData <- reactive({ 

    validate(
     need(input$datfile != "", "Please upload a file") 
    ) 

    infile <- input$datfile 
    dat <- read.csv(infile$datapath, 
        header = T, 
        stringsAsFactors = F) 

    if(is.null(infile)) return(NULL) 

    data.frame(x = dat[, input$x], 
       y = dat[, input$y]) 

    }) 

    # A simple visualisation. In shiny apps, need to register observers 
    # and tell shiny where to put the controls 
    theData %>% 
    ggvis(~x, ~y) %>% 
    layer_points() %>% 
    bind_shiny("plot", "plot_ui") 

}) 

ui.R

library(ggvis) 
library(shiny) 
shinyUI(pageWithSidebar(
    div(), 
    sidebarPanel(
    fileInput('datfile', ''), 
    selectInput('x', 'x:' ,'x'), 
    selectInput('y', 'y:', 'y'), 
    uiOutput("plot_ui") 
), 
    mainPanel(
    ggvisOutput("plot") 
) 
)) 
+0

Я могу заставить это работать с googleVis, но я хотел бы использовать некоторые функции, которые недоступны в этом пакете. – maloneypatr

ответ

5

Вот попытка, я добавил пару реактивных блоков, чтобы получить имена, которые должны быть добавлены на ось графика.

Хитрость вы можете использовать это, чтобы создать отфильтрованный dataframe, который имеет две колонки x и y и что меняется, когда пользователь изменяет значения в selectInput. Затем вы можете рассказать ggvis о построении x и y из этого фильтрованного кадра данных, и график будет интерактивным.

library(shiny) 
library(dplyr) 
library(ggvis) 

shinyServer(function(input, output, session) { 
    #load the data when the user inputs a file 
    theData <- reactive({ 
    infile <- input$datfile   
    if(is.null(infile)) 
     return(NULL)   
    d <- read.csv(infile$datapath, header = T) 
    d   
    }) 



    # dynamic variable names 
    observe({ 
    data<-theData() 
    updateSelectInput(session, 'x', choices = names(data)) 
    updateSelectInput(session, 'y', choices = names(data)) 

    }) # end observe 

    #gets the y variable name, will be used to change the plot legends 
    yVarName<-reactive({ 
    input$y 
    }) 

#gets the x variable name, will be used to change the plot legends 
    xVarName<-reactive({ 
    input$x 
    }) 

    #make the filteredData frame 

    filteredData<-reactive({ 
    data<-isolate(theData()) 
    #if there is no input, make a dummy dataframe 
    if(input$x=="x" && input$y=="y"){ 
     if(is.null(data)){ 
     data<-data.frame(x=0,y=0) 
     } 
    }else{ 
     data<-data[,c(input$x,input$y)] 
     names(data)<-c("x","y") 
    } 
    data 
    }) 

    #plot the ggvis plot in a reactive block so that it changes with filteredData 
    vis<-reactive({ 
    plotData<-filteredData() 
    plotData %>% 
    ggvis(~x, ~y) %>% 
    layer_points() %>% 
    add_axis("y", title = yVarName()) %>% 
    add_axis("x", title = xVarName()) %>% 
    add_tooltip(function(df) format(sqrt(df$x),digits=2)) 
    }) 
    vis%>%bind_shiny("plot", "plot_ui") 

}) 

EDIT: добавлены всплывающие подсказки.

+0

Эй, @NICE, огромное спасибо за помощь в этом! Я никогда не думал помещать 'data <- theData()' внутри оператора 'наблюдать'. Последнее, что я хочу услышать, это добавить подсказки, я думаю, что это сработает, но мне, возможно, придется связаться, если я не смогу. : p Еще раз спасибо! – maloneypatr

+0

Конечно, рад, что я мог бы помочь! – NicE

+0

Можете ли вы обновить это, чтобы продемонстрировать, как будут работать всплывающие подсказки? Я сталкиваюсь с ошибками, добавляя всплывающие подсказки и редактируя данные. Например, если я хотел вычислить 'sqrt (x)' вместо 'x', это не сработает. В очередной раз благодарим за помощь! – maloneypatr