Как исправить - Объект «Inputs2» не найден. И получить окончательный сюжет в R Shiny - PullRequest
0 голосов
/ 04 июля 2018

Я новичок в создании приложений в RStudio Shiny. Я проверил все в моем следующем коде, и он, кажется, работает вплоть до построения графика, однако я не могу получить какой-либо график, и в окне сервера выдается ошибка: «Объект« Inputs2 »не найден». Любая помощь будет оценена с кодом. И моя последняя цель - получить сюжет.

library(shiny)
library(Benchmarking)
library(plotly)

# load data 
maindata <- read.csv("raw.csv", stringsAsFactors = FALSE)


# Define UI for application 
ui <- fluidPage(theme = "bootstrap.css",


# Application title
titlePanel("Preferred Usage"),

# Sidebar with a slider input for number of bins 
sidebarLayout(
  sidebarPanel(
    h3("Enter Inputs",""),
    numericInput("qout1", "Output 1","0"),
    numericInput("qout2", "Output 2","0"),
    numericInput("qin1", "Input 1","0"),
    numericInput("qin2", "Input 2","0"),
    numericInput("qin3", "Input 3","0"),
    numericInput("pin1", "Price Input 1","0"),
    numericInput("pin2", "Price Input 2","0"),
    numericInput("pin3", "Price Input 3","0"),
    actionButton("runButton", "Run Analysis")


  ),

  # Show a plot of the generated distribution
  mainPanel(
     plotOutput("coolplot")

   )
 )
)

Код на стороне сервера:

server <- function(input, output) {


# The important part of reactiveValues()
values <- reactiveValues()
grph <- reactiveValues()
values$df <- maindata 
addData <- observe({

# your action button condition
if(input$runButton > 0) {
  # create the new line to be added from your inputs
  newLine <- isolate(c(input$qout1, input$qout2, input$qin1, input$qin2, input$qin3, input$pin1, input$pin2, input$pin3))
  # update your data
  # note the unlist of newLine, this prevents a bothersome warning message that the rbind will return regarding rownames because of using isolate.
  table1 <- isolate(values$df <- rbind(unlist(newLine), as.matrix(values$df)))



  # inputs and outputs for analysis
  y <- data.frame(table1[, 1:2])
  x <- data.frame(table1[, 3:5])
  w <- data.frame(table1[, 6:8])



  # function to do some analysis
  xopt <- cost.opt(x, y, w, RTS=1)

  # Fetch results
  results <- data.frame(xopt[["xopt"]])
  results[1,]

  #Prepare data for plotting 
  Inputs <- c("Seed", "Fertilizer", "Power")
  Inputs2 <- as.numeric(c(x[1,]))
  Inputs3 <-  as.numeric(c(results[1,]))

  isolate(grph$try1 <- rbind(Inputs, Inputs2, Inputs3))

  grph$try1 <- data.frame(t(grph$try1))

}

})



output$coolplot <- renderPlotly({p <- plot_ly(data.frame(grph$try1), x = ~Inputs, y = ~Inputs2, type = 'bar', text = round(Inputs2, 2), textposition = 'auto', name = 'Inputs2', marker = list(color = 'rgb(204,204,204)')) %>%
add_trace(y = ~Inputs3, text = round(Inputs3, 2), textposition = 'auto', name = 'Inputs3', marker = list(color = 'rgb(49,130,189)')) %>%
layout(title = "Plot", barmode = 'group', yaxis = list(title = "Count"))})

}

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

Воспроизводимые образцы данных из вышеуказанной работы:

1 - «raw.csv» с начальными 5 строками

structure(list(qout1 = c(6.278, 7.345, 6.609, 6.141, 8.653), 
qout2 = c(4.399, 5.423, 4.787, 3.947, 5.492), qin1 = c(1.719, 
3.422, 2.585, 2.308, 2.717), qin2 = c(0.891, 1.663, 1.018, 
1.484, 1.54), qin3 = c(0.906, 0.742, 0.826, 1.406, 1.621), 
pin1 = c(1.798, 0.675, 0.743, 1.76, 1.774), pin2 = c(3.377, 
2.871, 4.857, 3.19, 3.283), pin3 = c(6.42, 8.997, 9.13, 6.136, 
6.205)), row.names = c(NA, 5L), class = "data.frame")

2 - данные "table1" из кода на стороне сервера, первые пять строк. первая строка равна нулю для всех переменных, поскольку все новые входные данные были равны нулю:

structure(c(0, 6.278, 7.345, 6.609, 6.141, 0, 4.399, 5.423, 4.787, 
3.947, 0, 1.719, 3.422, 2.585, 2.308, 0, 0.891, 1.663, 1.018, 
1.484, 0, 0.906, 0.742, 0.826, 1.406, 0, 1.798, 0.675, 0.743, 
1.76, 0, 3.377, 2.871, 4.857, 3.19, 0, 6.42, 8.997, 9.13, 6.136
), .Dim = c(5L, 8L), .Dimnames = list(NULL, c("qout1", "qout2", 
"qin1", "qin2", "qin3", "pin1", "pin2", "pin3"))

3- Наконец, данные «grph $ try1», которые передаются на график для анализа, представляют собой первые пять строк:

structure(list(Inputs = structure(c(3L, 1L, 2L, NA, NA), .Label = 
c("Fertilizer", "Power", "Seed"), class = "factor"), Inputs2 = 
structure(c(1L, 1L, 1L, NA, NA), .Label = "0", class = "factor"), 
Inputs3 = structure(c(1L, 1L, 1L, NA, NA), .Label = "0", class = 
"factor")), row.names = c("1", "2", "3", "NA", "NA.1"), class = 
"data.frame")

1 Ответ

0 голосов
/ 05 июля 2018

Ваша первая проблема заключается в том, что график отображается перед вычислением grph$try1. Вы можете избежать этого довольно легко, включив req статут, подобный этому

output$coolplot <- renderPlotly({
      req(!is.null(grph$try1))
      p <- plot_ly(
                   ...
)})

Вы также хотите изменить пользовательский интерфейс с plotOutput на plotlyOutput.

Поскольку вы хотите получить доступ к различным входам из data.frame, я думаю, вам лучше инициировать grph$try1 непосредственно как data.frame, подобный этому

isolate(grph$try1 <- data.frame(Inputs, Inputs2, Inputs3))

вам также нужно будет добавить ~ до того, как раунд заработает другим мудрым образом, теперь он не должен оценивать их внутри. Сюжетный призыв наконец-то выглядит вот так

p <- plot_ly(grph$try1, 
             x = ~Inputs,
             y = ~Inputs2, 
             type = 'bar',
             text = ~round(Inputs2, 2),
             textposition = 'auto', name = 'Inputs2', marker = list(color = 'rgb(204,204,204)')) %>%
      add_trace(y = ~Inputs3,
                text = ~round(Inputs3, 2), 
                textposition = 'auto', 
                name = 'Inputs3',
                marker = list(color = 'rgb(49,130,189)')) %>%
      layout(title = "Plot", barmode = 'group', yaxis = list(title = "Count"))

Надеюсь, это поможет !!

...