为什么在 R 中找不到对象 'values'?

Why is the object 'values' not found in R?

我试了很多次,但我不知道为什么错误仍然存​​在,这是我试过的代码:

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

# global
traininginput <-  as.data.frame(runif(50, min=0, max=100))
trainingoutput <- sqrt(traininginput)
trainingdata <- cbind(traininginput,trainingoutput)
colnames(trainingdata) <- c("Input","Output")
testdata <- as.data.frame((1:13)^2) 

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

           plotOutput("main_plot"),

           hr(),

           numericInput(inputId = "HL1_noN",
                        label = "Hidden Layer 1 : Number of Neuron:",
                        value = 5),

           numericInput(inputId = "HL2_noN",
                        label = "Hidden Layer 2 : Number of Neuron:",
                        value = 5), 

           numericInput(inputId = "TL",
                        label = "Treshold level:",
                        value = 0.01,
                        step  = 0.01),

           actionButton("update", "Update View"),

           br(),
           br(),

           numericInput(inputId = "rmse_",
                         label = "Root Mean Square Error",
                         value = sqrt(sum((sqrt(testdata)- net.results)^2)/length(net.results))))))
#--------------------------------------------------------------------------------------------
server <- function(input, output, session) {

  values <- reactiveValues(

    net.sqrt <- neuralnet(Output~Input,trainingdata, hidden=c(values$HL1_noN, values$HL2_noN), threshold=values$TL),
    net.results <- predict(net.sqrt, testdata), 
    cleanoutput <- cbind(testdata,sqrt(testdata),
                         as.data.frame(net.results)),
    colnames(cleanoutput) <- c("Input","ExpectedOutput","NeuralNetOutput"),

    rmse_ = sqrt(sum((sqrt(testdata)- net.results)^2)/length(net.results)),

    HL1_noN = 5,
    HL2_noN = 5,
    TL      = 0.007,
    rmse_   = sqrt(sum((sqrt(testdata)- net.results)^2)/length(net.results)))

  observeEvent(input$update, {
    net.sqrt <- neuralnet(Output~Input,trainingdata, hidden=c(values$HL1_noN, values$HL2_noN), threshold=values$TL)
    net.results <- predict(net.sqrt, testdata) 
    cleanoutput <- cbind(testdata,sqrt(testdata),
                         as.data.frame(net.results))
    colnames(cleanoutput) <- c("Input","ExpectedOutput","NeuralNetOutput")

    values$HL1_noN <- input$HL1_noN
    values$HL2_noN <- input$HL2_noN
    values$TL      <- input$TL
    values$rmse_   <- input$rmse_ })

  output$main_plot <- renderPlot({
    net.sqrt <- neuralnet(Output~Input,trainingdata, hidden=c(values$HL1_noN, values$HL2_noN), threshold=values$TL)
    net.results <- predict(net.sqrt, testdata)
    cleanoutput <- cbind(testdata,sqrt(testdata),
                         as.data.frame(net.results))
    colnames(cleanoutput) <- c("Input","ExpectedOutput","NeuralNetOutput")
    ggplot(data = cleanoutput, aes(x= ExpectedOutput, y= NeuralNetOutput)) + geom_point() +
      geom_abline(intercept = 0, slope = 1
                  , color="brown", size=0.5)})}

shinyApp(ui,server)

# rmse_ = sqrt(sum((sqrt(testdata)- net.results)^2)/length(net.results))

我认为我的错误是我将公式直接插入 'values'。但是我真的希望它能在我给Hidden Layer 1Hidden Layer 2Threshold Level赋值的时候计算出rmse_的值。我应该改变哪一部分?谁能给我一些提示?或者我已经使用了错误的功能?

如果我问的方式有点不合适,我很抱歉。因为我是 R 的新手,谁能给我一些如何操作的提示?我已经尽力了,但我不确定自己是否走在正确的道路上。

我试着简化你的内容:

  • 我假设您想在计算后更新 numericInput rmse_;所以你可以在你的 ui 中有一个占位符,用于在按下操作按钮 update 后更新的值

  • 您可以有一个 eventReactive 表达式,当按下 update 按钮时将调用该表达式。在这里你可以 运行 你的神经网络。隐藏层数将来自您的输入。

  • updateNumericInput 将在重新计算时更新 rmse_ 值。

  • 您的渲染图将调用反应式表达式以获取更新数据并在按下 update 后自动重新绘制。

  • 如果您不希望有人在 ui 中编辑您的 rmse_,您可能需要使用 textOutput 而不是 numericInput -进一步修改会相对容易。

如果这更接近您的需要,请告诉我。

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

# global
traininginput <-  as.data.frame(runif(50, min=0, max=100))
trainingoutput <- sqrt(traininginput)
trainingdata <- cbind(traininginput,trainingoutput)
colnames(trainingdata) <- c("Input","Output")
testdata <- as.data.frame((1:13)^2) 

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

           plotOutput("main_plot"),

           hr(),

           numericInput(inputId = "HL1_noN",
                        label = "Hidden Layer 1 : Number of Neuron:",
                        value = 5),

           numericInput(inputId = "HL2_noN",
                        label = "Hidden Layer 2 : Number of Neuron:",
                        value = 5), 

           numericInput(inputId = "TL",
                        label = "Threshold level:",
                        value = 0.01,
                        step  = 0.01),

           actionButton("update", "Update View"),

           br(),
           br(),

           numericInput(inputId = "rmse_",
                        label = "Root Mean Square Error",
                        value = NULL
                        ))))
#--------------------------------------------------------------------------------------------
server <- function(input, output, session) {

  cleanoutput <- eventReactive(input$update, {
    net.sqrt <- neuralnet(Output~Input,trainingdata, hidden=c(input$HL1_noN, input$HL2_noN), threshold=input$TL)
    net.results <- predict(net.sqrt, testdata) 
    cleanoutput <- cbind(testdata,sqrt(testdata), as.data.frame(net.results))
    colnames(cleanoutput) <- c("Input","ExpectedOutput","NeuralNetOutput")
    updateNumericInput(session, inputId = "rmse_", value = sqrt(sum((sqrt(testdata)- net.results)^2)/length(net.results)))
    return(cleanoutput)
  })

  output$main_plot <- renderPlot({
    ggplot(data = cleanoutput(), aes(x= ExpectedOutput, y= NeuralNetOutput)) + 
      geom_point() +
      geom_abline(intercept = 0, slope = 1, color="brown", size=0.5)
  })

}

shinyApp(ui,server)

如果您想将 rmse 作为文本输出(而不是输入),请将 uinumericInput 更改为 textOutput("rmse") 并且服务器可以包括:

server <- function(input, output, session) {

  rv_rmse <- reactiveVal()

  cleanoutput <- eventReactive(input$update, {
    net.sqrt <- neuralnet(Output~Input,trainingdata, hidden=c(input$HL1_noN, input$HL2_noN), threshold=input$TL)
    net.results <- predict(net.sqrt, testdata) 
    cleanoutput <- cbind(testdata,sqrt(testdata), as.data.frame(net.results))
    colnames(cleanoutput) <- c("Input","ExpectedOutput","NeuralNetOutput")
    rv_rmse(sqrt(sum((sqrt(testdata)- net.results)^2)/length(net.results)))
    return(cleanoutput)
  })

  output$rmse <- renderText(paste("Root Mean Square Error:", rv_rmse()))

  output$main_plot <- renderPlot({
    ggplot(data = cleanoutput(), aes(x= ExpectedOutput, y= NeuralNetOutput)) + 
      geom_point() +
      geom_abline(intercept = 0, slope = 1, color="brown", size=0.5)
  })

}