Я новичок в создании приложений в 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")