Заполнить пользовательским вводом реактивный фрейм данных с циклом

#r #dataframe #loops #shiny

#r #фрейм данных #циклы #блестящий

Вопрос:

Для простого приложения в Shiny я хочу использовать пользовательский ввод, выполнять с ним простые арифметические операции и сохранять результаты в фрейме данных с общей целью затем отобразить его, сравнив результаты из первого столбца со вторым столбцом для x = 1: 60.

Будучи новичком в Shiny, я с трудом справляюсь с реактивной частью в цикле, поэтому мой код в настоящее время выглядит как простой метод выполнения операции в R и якобы не работает.

Любой намек на сохранение реактивных значений в фрейме данных будет оценен.

В упрощенном виде мой код выглядит так:

 ui <- fluidPage(
 numericInput("In1", "Input 1", 60),
 numericInput("In2", "Input 2", 100),
 numericInput("In3", "Input 3", 100)

mainPanel(plotOutput("plot))
)
_______
server <- function(input, output) {

data1 <- reactive({

data1 <- data.frame(x = 0, y = 1:60)

data1[1, 1] = (input$In1 * 4 * 12)/input$In3
data1[1, 2] = (input$In2 * 4 * 12)/input$In3

for (i in 2:60) {
data1[i,1] = (input$In1 * 4 * 12)/input$In3)   data1[i-1]
data1[i,2] = (input$In2 * 4 * 12)/input$In3)   data1[i-1]
}})

output$plot <- renderPlot({...})

 

Ответ №1:

Вы можете написать приложение как :

 library(shiny)

ui <- fluidPage(
  numericInput("In1", "Input 1", 60),
  numericInput("In2", "Input 2", 100),
  numericInput("In3", "Input 3", 100),
  
  mainPanel(tableOutput("data"))
)

server <- function(input, output) {

data1 <- reactive({

data1 <- data.frame(x = 0, y = 1:60)

data1[1, 1] = (input$In1 * 4 * 12)/input$In3
data1[1, 2] = (input$In2 * 4 * 12)/input$In3

for (i in 2:60) {
data1[i,1] = ((input$In1 * 4 * 12)/input$In3)   data1[i-1, 1]
data1[i,2] = ((input$In2 * 4 * 12)/input$In3)   data1[i-1, 2]
}
return(data1)
})

#output$plot <- renderPlot({...})
output$data <- renderTable({data1()})
}

shinyApp(ui, server)
 

введите описание изображения здесь

Я не включил никакого кода графика, а вместо этого отобразил фрейм данных, но вы также можете включить вывод графика так, как хотите.