简体   繁体   中英

reading excel files into Shiny

I'm new to Shiny and am trying to run an app using data from an excel file. Seems like it should be simple, but can't figure it out. there's load of info out there on more complex tasks (uploading files interactively, where you specify columns, file location etc) - but all I want is an app that uses data from a single excel file that has loaded in the background.

Similar questions have been asked before ( Uploading csv file to shinyApps.io and R Shiny read csv file ) but I didn't get a satistactory answer from them.

I have my excel file saved in the same directory as the app.R file, in a folder named 'data'. And I read it into the server part of my script like this:

server <- function(input, output){
  # Read in data
  myDF <- read_excel('data/MyShinyData.xlsx')

When I run the app.R file to test the app, it works fine. But when I publish it to the Shiny website using shinyapps::deployApp('pathToWorkingDirectory') I get a grayed out version of the app that has no interactivity. The app also publishes to the website fine if I simulate the data within the app.R file (the excel file is just this simulated data, written to excel with write.xlsx) - its only when I take out the code for simulating the data and replace it with the read_excel command that it stops working. I've also tried with a .csv file instead of .xlsx, but same problem.

I've copied the full code from the app.R file below.

What am I doing wrong? Thanks for your help.

library('ggplot2')
library('shiny')
library('psych')
library('readxl')

#===============
#This code makes a histogram, a coplot, and a prediction for species richness ('SpNat') given Forest cover ('NBT').
#===============

m1 <- lm(SpNat ~ NBT, data=myDF) #For prediction. best to create all non-reactive [ie non-updating] code outside the app, so it doesn't have to run every time.

#==========
# ui section
#==========

ui <- fluidPage(

  ### MAKING A TITLE
  titlePanel("Dashboard based on excel data"),

  ### DIVIDING INPUTS TO SIDEBAR VS MAIN PANELS:
  sidebarLayout(

    sidebarPanel(                                                           #everything nested in here will go in sidebar
  #dropdown input for coplot:
  tags$h3('Select coplot variables'), #heading
  selectInput(inputId='choiceX', label='Choose X variable', 
              choices=c('Species richness'='SpNat', 'Forest cover'='NBT', 'Pest control'='PC')), #***Choices are concatenated text strings. 
  selectInput(inputId='choiceY', label='Choose Y variable', 
              choices=c('Species richness'='SpNat', 'Forest cover'='NBT', 'Pest control'='PC')),
  selectInput(inputId='choiceZ', label='Choose conditioning variable', 
              choices=c('Species richness'='SpNat', 'Forest cover'='NBT', 'Pest control'='PC')),
#checkbox input for pairs plots:
  tags$h3('Select variables for pairs plots'), #heading
  checkboxGroupInput(inputId='vars', label='Choose at least two variables for pairs plot', 
                   selected=c('SpNat', 'NBT', 'PC'), #'determines which vars start off checked. Important for pairs, cos <2 and plot wont work.
                   choices=c('Species richness'='SpNat', 'Forest cover'='NBT', 'Pest control'='PC')), #***Server receives input as a single concatenated text 

#slider input for prediction:  
  tags$h3('Predicting forest cover'), #heading
  sliderInput(inputId='num',label='Pick a forest cover level', value=10, min=1, max=100)),

  mainPanel(                                                               #everything nested in here will go in main panel
#specify output for app, including headings:
  tags$h3('Coplot:'),
  plotOutput(outputId='coplot'),
  tags$h3('Histogram:'),  
  plotOutput(outputId='pairs'),
  tags$h3('Predicted species richness:'),  
  verbatimTextOutput('prediction'))))

#==========
# server section
#==========

server <- function(input, output){
  # Read in data
  myDF <- read_excel('data/MyShinyData.xlsx') #don't need full path
  myDF$PC <-  as.factor(myDF$PC)
  myDF <- select(myDF, SpNat, NBT, PC)

  #create output object, and name it so it corresponds to the ui output function ID, plus use the ui input ID to create it: 
  output$coplot <- renderPlot(
    ggplot(myDF, aes_string(input$choiceX, input$choiceY, col=input$choiceZ)) + geom_point())    #note use of aes_string to allow inputID use direct.
  output$pairs <- renderPlot({
    pairs.panels(subset(myDF, select=input$vars))})
  output$prediction <- renderPrint({
    newData <- data.frame(NBT=input$num)
    cat(predict(m1, newdata = newData))
  })
}

#==========
# and stitch together
#==========

shinyApp(ui=ui, server=server)

Figured it out. I had two problems:

(1) I had copied the app into a new folder prior to publishing, so the working directory had changed - needed to reset to the folder containing my app.R file prior to running shinyapps::deployApp .

(2) a couple of packages required by my app load automatically into my R console (I've made changes to my .Rprofile file). So while I didn't need to load these to run the app locally, I did to publish it online.

Both pretty dumb mistakes, but you live and learn.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM