首页 > 解决方案 > 在 r shiny 中创建新变量 = 现有变量 + 用户输入

问题描述

我正在为我学校的学生成绩开发一个应用程序。

在将某些数字添加到每个学生的成绩后,我想查看失败与通过的摘要。

下面的一个例子

library(shiny)
biology_num <- c(49,64,74,84)
biology_pass_fail <- ifelse(biology_num < 50, "Fail", "Pass")
First <- data.frame(cbind(biology_num,biology_pass_fail))
First$biology_num <- as.numeric(as.character(First$biology_num))

用户界面

ui <- fluidPage(
            selectInput("Subject",
                        "Choose Subject",
                         choices=list("biology")),
            numericInput("Addition","If we added","1"),
            tableOutput("table"),
            tableOutput("table2")
   )

服务器 这是问题

server <- shinyServer(function(input,output){
#Here I want to create a new dataframe that combines 
#the existing grades + the potential add      

New_biology <- reactive({
as.data.frame(cbind(New_biology_num+input$Addition))

New_biology$New_biology_pass_fail <- 
          as.factor(ifelse(New_biology$New_biology_num <50,"Fail","Pass"))
     })

output$table <- renderTable(as.table(summary(First$biology_pass_fail)))

output$table2 <- renderTable(as.table(summary({New_biology$New_biology_pass_fail()})))
    }
)

shinyApp(ui,server)

然后我收到错误

“闭包”类型的对象不可子集

我传递New_biology$New_biology_pass_fail给公式的方式有问题,output$table2或者可能在reactive公式中。

非常感谢您的指导!

标签: rshiny

解决方案


这似乎以您希望的方式工作:

library(shiny)
biology_num <- c(49, 64, 74, 84)
biology_pass_fail <- ifelse(biology_num < 50, "Fail", "Pass")

# DON'T call data.frame(cbind()). Just use data.frame()!
First <- data.frame(biology_num, biology_pass_fail)

ui <- fluidPage(
  selectInput("Subject",
              "Choose Subject",
              choices=list("biology")),
  numericInput("Addition","If we added","1"),
  tableOutput("table"),
  tableOutput("table2")
)

server <- function(input,output) {  

  New_biology <- reactive({
    New_biology_num <- biology_num + input$Addition

    data.frame(New_biology_num,
               New_biology_pass_fail = as.factor(ifelse(New_biology_num < 50, "Fail", "Pass")))    
  })

  output$table <- renderTable(First)

  output$table2 <- renderTable(New_biology())
}

shinyApp(ui, server)

重要的是要知道反应元素是函数。因此,如果您创建了一个反应元素(在这种情况下New_biology),您需要将它作为一个函数调用,以便它返回一个值(即New_biology())。如果一个反应元素返回一个data.frame,并且你想访问一个特定的列,你需要在函数调用之后应用访问器(例如New_biology()$New_biology_pass_fail)。


推荐阅读