Ошибка в writeImpl: текст для записи должен быть вектором символов длиной один - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь написать программу, которая делает коробочные диаграммы для моей команды на основе того, что им нужно. Я все время сталкиваюсь с ошибкой Error in writeImpl: Text to be written must be a length-one character vector. Я считаю, что он исходит из того места, где я фильтрую свои данные в новый data.frame, чтобы создать коробчатую диаграмму. (возможно) Любая помощь, которую вы можете предоставить, будет принята с благодарностью. Вот код:

library(shiny)
All_Data <- data.frame(
    Name = as.character(c("2015 Acidobacteria C1", "2015 Acidobacteria C1", "2015 Acidobacteria C1", "2015 Acidobacteria C1", "2015 Actinobacteria C1")),
    Year = c(2015, 2015, 2015, 2015,2015),
    Bacteria = as.factor(c("Acidobacteria", "Acidobacteria", "Acidobacteria", "Acidobacteria","Actinobacteria")),
    Site = as.factor(c("C1", "C1", "C1", "C1","C1")),
    Percents = as.numeric(c(5,2,3,5,5)),
    stringsAsFactors = TRUE
)
ndata <-data.frame(
    Name = as.character("Preset"),
    Year = c("0"),
    Bacteria = as.factor(c("0")),
    Site = as.factor(c("0")),
    Percents = as.numeric(c("0")),
    stringsAsFactors = TRUE
)

# Define UI for application
ui <- fluidPage(

    # Application title
    titlePanel("Boxplot Maker"),

    # Sidebar
    sidebarLayout(
        sidebarPanel(
            h3("Which Data Sets Would You Like to Compare?"),
            selectInput("Set1", "", choices = All_Data$Name),
            selectInput("Set2", "",choices = All_Data$Name),
            selectInput("factor","Based on Which Factor?", choices = c("Year", "Site", "Bacteria", "Site by Year", "Bacteria by Year", "Bacteria by Site by Year")),
            textInput("title", h4("Title"), value = "Enter title..."),
            actionButton("Submit", "Submit")
        ),

        # Show a chosen plot
        mainPanel(
        uiOutput("data"),
        plotOutput("plot")
            )
    )
)

# Define server logic
server <- function(input, output) {
    output$data <- renderUI(
        conditionalPanel( condition = "input.Submit >0",
                          ndata <- filter(All_Data, All_Data$Name == input$Set1 | All_Data$Name == input$Set2)
        
    ))
    output$plot <- renderPlot(
        boxplot(Percents ~ Year, data = ndata, main = input$title)
    )
   }

# Run the application 
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 04 августа 2020

Вы использовали renderUI для фрейма данных. Вы должны использовать renderDataTable. Кроме того, вам просто нужно observeEvent, а не conditionalPanel. Попробуйте это:

library(shiny)
All_Data <- data.frame(
  Name = as.character(c("2015 Acidobacteria C1", "2015 Acidobacteria C2", "2015 Acidobacteria C3", "2015 Acidobacteria C4", "2015 Actinobacteria C5")),
  Year = c(2015, 2015, 2015, 2015,2015),
  Bacteria = as.factor(c("Acidobacteria", "Acidobacteria", "Acidobacteria", "Acidobacteria","Actinobacteria")),
  Site = as.factor(c("C1", "C2", "C3", "C4","C5")),
  Percents = as.numeric(c(5,2,3,5,5)),
  stringsAsFactors = TRUE
)
ndata <-data.frame(
  Name = as.character("Preset"),
  Year = c("0"),
  Bacteria = as.factor(c("0")),
  Site = as.factor(c("0")),
  Percents = as.numeric(c("0")),
  stringsAsFactors = TRUE
)

# Define UI for application
ui <- fluidPage(

  # Application title
  titlePanel("Boxplot Maker"),

  # Sidebar
  sidebarLayout(
    sidebarPanel(
      h3("Which Data Sets Would You Like to Compare?"),
      selectInput("Set1", "", choices = All_Data$Name),
      selectInput("Set2", "",choices = All_Data$Name),
      selectInput("factor","Based on Which Factor?", choices = c("Year", "Site", "Bacteria", "Site by Year", "Bacteria by Year", "Bacteria by Site by Year")),
      textInput("title", h4("Title"), value = "Enter title..."),
      actionButton("Submit", "Submit")
    ),

    # Show a chosen plot
    mainPanel(
      #uiOutput("data"),
      DT::dataTableOutput("data"),
      plotOutput("plot")
    )
  )
)

# Define server logic
server <- function(input, output) {

  ndata <- eventReactive(input$Submit, {
    req(input$Submit)
    ndata <- filter(All_Data, All_Data$Name == input$Set1 | All_Data$Name == input$Set2)
  })
  
  output$data <- DT::renderDataTable({
    ndata()
  })
  
  output$plot <- renderPlot(
    boxplot(Percents ~ Year, data = ndata(), main = input$title)
  )

}

# Run the application
shinyApp(ui = ui, server = server)

вывод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...