Как применить actionButton «Upate View» в Shiny в R? - PullRequest
0 голосов
/ 14 апреля 2020

Это мой оригинальный код:

library(shiny)
library("neuralnet")
require(ggplot2)

load("C:/gambit/NeuralNetwork.Rdata")

ui <- fluidPage(
  fluidRow(
    column(width = 12, class = "well",
           h4("Neural Network Plot"),

           plotOutput("main_plot"),

           hr(),

           numericInput(inputId = "w",
                       label = "Weight(w):",
                       value = 5),

           numericInput(inputId = "b",
                       label = "Biased(b):",
                       value = 5))))
#--------------------------------------------------------------------------------------------
server <- function(input, output) {

  output$main_plot <- renderPlot({
    traininginput <-  as.data.frame(runif(50, min=0, max=100))
    trainingoutput <- sqrt(traininginput)
    trainingdata <- cbind(traininginput,trainingoutput)
    colnames(trainingdata) <- c("Input","Output")
    net.sqrt <- neuralnet(Output~Input,trainingdata, hidden=c(input$w, input$b), threshold=0.01)
    print(net.sqrt)
    plot(net.sqrt)
    testdata <- as.data.frame((1:13)^2)  #Generate some squared numbers
    net.results <- predict(net.sqrt, testdata) #Run them through the neural network
    class(net.results)
    print(net.results)
    cleanoutput <- cbind(testdata,sqrt(testdata),
                         as.data.frame(net.results))
    colnames(cleanoutput) <- c("Input","ExpectedOutput","NeuralNetOutput")
    head(cleanoutput)
    lm1<- lm(NeuralNetOutput~ ExpectedOutput, data = cleanoutput)

    ggplot(data = cleanoutput, aes(x= ExpectedOutput, y= NeuralNetOutput)) + geom_point() +
      geom_abline(intercept = 0, slope = 1
                  , color="brown", size=0.5)})}

shinyApp(ui,server)

Код, который я пробовал:

library(shiny)
library("neuralnet")
require(ggplot2)

load("C:/gambit/NeuralNetwork.Rdata")

ui <- fluidPage(
  fluidRow(
    column(width = 12, class = "well",
           h4("Neural Network Plot"),

           plotOutput("main_plot"),

           hr(),

           numericInput(inputId = "w",
                       label = "Weight(w):",
                       value = 5),

           numericInput(inputId = "b",
                       label = "Biased(b):",
                       value = 5), 

           actionButton("update", "Update View"))))
#--------------------------------------------------------------------------------------------
server <- function(input, output) {

  output$main_plot <- renderPlot({
    traininginput <-  as.data.frame(runif(50, min=0, max=100))
    trainingoutput <- sqrt(traininginput)
    trainingdata <- cbind(traininginput,trainingoutput)
    colnames(trainingdata) <- c("Input","Output")
    net.sqrt <- neuralnet(Output~Input,trainingdata, hidden=c(input$w, input$b), threshold=0.01)
    print(net.sqrt)
    plot(net.sqrt)
    testdata <- as.data.frame((1:13)^2)  #Generate some squared numbers
    net.results <- predict(net.sqrt, testdata) #Run them through the neural network
    class(net.results)
    print(net.results)
    cleanoutput <- cbind(testdata,sqrt(testdata),
                         as.data.frame(net.results))
    colnames(cleanoutput) <- c("Input","ExpectedOutput","NeuralNetOutput")
    head(cleanoutput)
    lm1<- lm(NeuralNetOutput~ ExpectedOutput, data = cleanoutput)

    ggplot(data = cleanoutput, aes(x= ExpectedOutput, y= NeuralNetOutput)) + geom_point() +
      geom_abline(intercept = 0, slope = 1
                  , color="brown", size=0.5)})}

shinyApp(ui,server)

Я бы sh добавил actionButton, который действительно работает так, чтобы я Можно обновить мой вид, а не обновлять его автоматически. Что я должен положить в мой server.R?

И лучше ли представить мой сценарий? Поскольку я совсем новичок в shiny, я надеюсь, что смогу получить какой-нибудь небольшой совет / подсказку от кого-либо из вас ..

Вам, ребята, нужен R.data? Если нужно, я могу послать это вам, ребята. Большое спасибо.

1 Ответ

1 голос
/ 14 апреля 2020

У меня нет ваших данных, и мне не нужно создавать нейронную сеть, чтобы продемонстрировать, как контролировать реактивность. Но некоторые конструктивные соображения для вашего блестящего приложения:

  1. Не смешивайте вывод данных и вывод таблиц / графиков. Если вам когда-нибудь понадобится просмотреть часть данных в другом реактивном блоке, вам не повезло, поскольку вы отбрасываете результаты в конце графика. Я предлагаю вам иметь здесь как минимум три разных реактивных блока: используемые данные, обученный нейронный net и вывод графика.

  2. Во всех блоках render*, reactive, и observe (и некоторые другие), любые виды реактивных данных или объектов могут инициировать изменение блока. Исходя из моей первой рекомендации, если у вас есть блок dat <- reactive(...), то изменение в dat() также приведет к обновлению всех блоков, в которых он содержится (реактивность er go блестящая). Если вы хотите, чтобы блок использовал dat(), но только когда что-то еще происходит (т. Е. Не обновляется при изменении dat()), тогда используйте isolate(dat()), чтобы получить данные, не определяя реактивный компонент.

    Два специальных реактивных блока - это observeEvent и eventReactive, которые реагируют на первый аргумент, но не во втором выражении / аргументе.

  3. Add-on: Я использую req, чтобы удостовериться, что ничего не срабатывает до того, как данные или триггеры сначала вступят в силу.

Вот небольшое приложение. Намерение таково: хотя график основан на случайных данных, он обновляет график только при явном нажатии кнопки Plot Now. Нажмите на кнопку Random и увидите, что данные меняются при каждом нажатии, а график - нет. Нажмите Plot Now и график обновится (в зависимости от текущего состояния данных).

library(shiny)
shinyApp(
  ui = fluidPage(
    fluidRow(
      actionButton("rand", "Random"),
      actionButton("btn", "Plot Now")
    ),
    fluidRow(
      textInput("dat", NULL, placeholder = "Random data not ready yet"),
      plotOutput("plt")
    )
  ),
  server = function(input, output, session) {
    dat <- reactive({
      input$rand
      sample(1e4, size = 10)
    })
    observeEvent(input$rand, {
      # automatically isolated, only input$rand causes updates
      req(dat()) # ensure there is data before trying to update the field
      updateTextInput(session, "dat", value = paste(dat(), collapse = ", "))
    })
    output$plt <- renderPlot({
      thisdat <- req(isolate(dat()))               # both require-valid and not-update
      req(input$btn)                               # just require-valid
      # at this point, we should always have "valid" data
      plot(seq_along(thisdat), thisdat, pch = 16)
    })
  }
)

sample shiny

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