Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 动态添加UI元素并将它们的输入收集到数据框中_R_User Interface_Shiny - Fatal编程技术网

R 动态添加UI元素并将它们的输入收集到数据框中

R 动态添加UI元素并将它们的输入收集到数据框中,r,user-interface,shiny,R,User Interface,Shiny,我的ui.R函数如下所示 library(shiny) shinyUI(pageWithSidebar( headerPanel("Add Features"), sidebarPanel(width=4, fluidRow( column(6, selectInput("features", label = h3("Features"), choices = list("Feature1","Feature2","Feature3"), selected = "Fe

我的
ui.R
函数如下所示

library(shiny)

shinyUI(pageWithSidebar(
  headerPanel("Add Features"),
  sidebarPanel(width=4,
  fluidRow( 
  column(6,  selectInput("features", label = h3("Features"), 
  choices = list("Feature1","Feature2","Feature3"), selected = "Feature1")),    

  br(),
  br(),
  column(6,  numericInput("n", label="",min = 0, max = 100, value = 50)),
  br(),
  column(2, actionButton("goButton", "Add!"))
  #column(3, submitButton(text="Analyze"))
)),


mainPanel(
verbatimTextOutput("nText"),
textOutput("text2")
)
))
我的
server.R
功能如下:

library(shiny)

shinyServer(function(input, output) {
 selFeatures <- data.frame()
  valFeatures <- data.frame()
  # builds a reactive expression that only invalidates 
  # when the value of input$goButton becomes out of date 
  # (i.e., when the button is pressed)
  ntext <- eventReactive(input$goButton, {

    selFeatures <- rbind(selFeatures,input$features)
    valFeatures <- rbind(valFeatures,input$n)
    paste("The variables are",input$features,input$n)
    paste("The variables are",selFeatures,valFeatures)
    })

    output$nText <- renderText({
    ntext()
  })
   output$text2 <- renderText({ 
     paste("You have selected", input$features)
   })
})
库(闪亮)
shinyServer(功能(输入、输出){

selFeatures我不太清楚为什么要使用
selectInputs
来设置变量值,下面是一个关于如何从动态生成的内容访问输入的一般示例:

library(shiny)

ui <- shinyUI(pageWithSidebar(
  headerPanel("Add Features"),
  sidebarPanel(width=4,
               fluidRow(column(12,
                               h3('Features'),
                               uiOutput('uiOutpt')
               )), # END fluidRow
               fluidRow(
                 column(4,div()),
                 column(4,actionButton("add", "Add!")),
                 column(4,actionButton('goButton',"Analyze"))
               ) # END fluidRow
  ), # END sidebarPanel
  mainPanel(
    verbatimTextOutput("nText"),
    textOutput("text2"),
    tableOutput('tbl')
  )
))

server <- shinyServer(function(input, output) {
  features <- reactiveValues(renderd=c(1))

  ntext <- eventReactive(input$goButton, {
    out <- lapply(features$renderd,function(i){
      fv <- paste0('numInp_',i)
      vn <- paste0('Feature',i)
      # Get input values by namw
      sprintf( 'Variable: %s, Value: %5.3f',input[[vn]],input[[fv]] )
    })
    do.call(paste,c(out,sep="\n"))
  })

  df <- eventReactive(input$goButton, {
    out <- lapply(features$renderd,function(i){
      fv <- paste0('numInp_',i)
      vn <- paste0('Feature',i)
      data.frame(Variable=input[[vn]], Value=input[[fv]] )
    })
    do.call(rbind,out)
  })

  output$nText <- renderText({
    ntext()
  })
  output$text2 <- renderText({ 
    sprintf("You have selected feature: %s", paste(features$renderd,collapse=", "))
  })

  output$tbl <- renderTable({
    df()
  })

  # Increment reactive values used to store how may rows we have rendered
  observeEvent(input$add,{
    if (max(features$renderd) > 2) return(NULL)
    features$renderd <- c(features$renderd, max(features$renderd)+1)
  })

  # If reactive vector updated we render the UI again
  observe({
    output$uiOutpt <- renderUI({
      # Create rows
      rows <- lapply(features$renderd,function(i){
        fluidRow(
          column(6,  selectInput(paste0('Feature',i), 
                                 label = "", 
                                 choices = list("Feature1","Feature2","Feature3"), 
                                 selected = paste0('Feature',i))),   
          column(6,  numericInput(paste0('numInp_',i), label="",min = 0, max = 100, value = runif(1,max=100)))
        )
      })
      do.call(shiny::tagList,rows)

    })
  })
})

shinyApp(ui=ui,server=server)  
库(闪亮)

ui我不太清楚为什么要使用
selectInputs
来设置变量值,因此下面是一个关于如何从动态生成的内容访问输入的一般示例:

library(shiny)

ui <- shinyUI(pageWithSidebar(
  headerPanel("Add Features"),
  sidebarPanel(width=4,
               fluidRow(column(12,
                               h3('Features'),
                               uiOutput('uiOutpt')
               )), # END fluidRow
               fluidRow(
                 column(4,div()),
                 column(4,actionButton("add", "Add!")),
                 column(4,actionButton('goButton',"Analyze"))
               ) # END fluidRow
  ), # END sidebarPanel
  mainPanel(
    verbatimTextOutput("nText"),
    textOutput("text2"),
    tableOutput('tbl')
  )
))

server <- shinyServer(function(input, output) {
  features <- reactiveValues(renderd=c(1))

  ntext <- eventReactive(input$goButton, {
    out <- lapply(features$renderd,function(i){
      fv <- paste0('numInp_',i)
      vn <- paste0('Feature',i)
      # Get input values by namw
      sprintf( 'Variable: %s, Value: %5.3f',input[[vn]],input[[fv]] )
    })
    do.call(paste,c(out,sep="\n"))
  })

  df <- eventReactive(input$goButton, {
    out <- lapply(features$renderd,function(i){
      fv <- paste0('numInp_',i)
      vn <- paste0('Feature',i)
      data.frame(Variable=input[[vn]], Value=input[[fv]] )
    })
    do.call(rbind,out)
  })

  output$nText <- renderText({
    ntext()
  })
  output$text2 <- renderText({ 
    sprintf("You have selected feature: %s", paste(features$renderd,collapse=", "))
  })

  output$tbl <- renderTable({
    df()
  })

  # Increment reactive values used to store how may rows we have rendered
  observeEvent(input$add,{
    if (max(features$renderd) > 2) return(NULL)
    features$renderd <- c(features$renderd, max(features$renderd)+1)
  })

  # If reactive vector updated we render the UI again
  observe({
    output$uiOutpt <- renderUI({
      # Create rows
      rows <- lapply(features$renderd,function(i){
        fluidRow(
          column(6,  selectInput(paste0('Feature',i), 
                                 label = "", 
                                 choices = list("Feature1","Feature2","Feature3"), 
                                 selected = paste0('Feature',i))),   
          column(6,  numericInput(paste0('numInp_',i), label="",min = 0, max = 100, value = runif(1,max=100)))
        )
      })
      do.call(shiny::tagList,rows)

    })
  })
})

shinyApp(ui=ui,server=server)  
库(闪亮)

uiOskar的回答对于我面临的类似挑战非常有用;对于无限功能,我想出了如何启用“删除”按钮并在按下“添加”按钮时保留值。对于后代,以下是我对Oskar代码的修改:

library(shiny)

ui <- shinyUI(pageWithSidebar(
  headerPanel("Add Features"),
  sidebarPanel(width=4,
               fluidRow(column(12,
                               h3('Features'),
                               uiOutput('uiOutpt')
               )), # END fluidRow
               fluidRow(
                 column(4,div()),
                 column(4,actionButton("add", "Add!")),
                 column(4,actionButton("remove", "Remove!")),
                 column(4,actionButton('goButton',"Analyze"))
               ) # END fluidRow
  ), # END sidebarPanel
  mainPanel(
    textOutput("text2"),
    tableOutput('tbl')
  )
))

server <- shinyServer(function(input, output) {
  features <- reactiveValues(renderd=c(1),
                             conv=c(50),
                             inlabels=c('A'),
                             outlabels=c('B'))

  df <- eventReactive(input$goButton, {
    out <- lapply(features$renderd,function(i){
      fv <- paste0('numInp_',i)
      vn <- paste0('InLabel',i)
      data.frame(Variable=input[[vn]], Value=input[[fv]] )
    })
    do.call(rbind,out)
  })

  output$nText <- renderText({
    ntext()
  })
  output$text2 <- renderText({ 
    paste(sprintf("You have selected feature: %s", paste(features$renderd,collapse=", ")))
  })

  output$tbl <- renderTable({
    df()
  })

  # Increment reactive values array used to store how may rows we have rendered
  observeEvent(input$add,{
    out <- lapply(features$renderd,function(i){
      fv <- paste0('numInp_',i)
      vn <- paste0('InLabel',i)
      vo <- paste0('OutLabel',i)
      data.frame(inlabels=input[[vn]],outlabels=input[[vo]], conv=input[[fv]] )
    })
    df<-do.call(rbind,out)
    print(df)
    features$inlabels <- c(as.character(df$inlabels),' ')
    features$outlabels <- c(as.character(df$outlabels),' ')
    print(c(features$inlabels,features$outlabels))

    features$renderd <- c(features$renderd, length(features$renderd)+1)
    print(features$renderd)
    print(names(features))
    features$conv<-c(df$conv,51-length(features$renderd))
  })

  observeEvent(input$remove,{
    features$renderd <- features$renderd[-length(features$renderd)]
  })

  # If reactive vector updated we render the UI again
  observe({
    output$uiOutpt <- renderUI({
      # Create rows
      rows <- lapply(features$renderd,function(i){
        fluidRow(
          # duplicate choices make selectize poop the bed, use unique():
          column(4,  selectizeInput(paste0('InLabel',i), 
                                 label = 'Input Name',selected=features$inlabels[i],
                                 choices=unique(c(features$inlabels[i],features$outlabels[!features$outlabels %in% features$inlabels])),
                                 options = list(create = TRUE))),
          column(4,  sliderInput(paste0('numInp_',i), label="Conversion",min = 0, max = 100, value = features$conv[i])),
          column(4, selectizeInput(paste0('OutLabel',i), 
                                label = "Output Name", selected=features$outlabels[i],
                                choices=unique(c(features$inlabels,features$outlabels)),
                                options = list(create = TRUE)))
        )
      })
      do.call(shiny::tagList,rows)
    })
  })
})

shinyApp(ui=ui,server=server)  
库(闪亮)

uiOskar的回答对于我面临的类似挑战非常有用;对于无限功能,我想出了如何启用“删除”按钮并在按下“添加”按钮时保留值。对于后代,以下是我对Oskar代码的修改:

library(shiny)

ui <- shinyUI(pageWithSidebar(
  headerPanel("Add Features"),
  sidebarPanel(width=4,
               fluidRow(column(12,
                               h3('Features'),
                               uiOutput('uiOutpt')
               )), # END fluidRow
               fluidRow(
                 column(4,div()),
                 column(4,actionButton("add", "Add!")),
                 column(4,actionButton("remove", "Remove!")),
                 column(4,actionButton('goButton',"Analyze"))
               ) # END fluidRow
  ), # END sidebarPanel
  mainPanel(
    textOutput("text2"),
    tableOutput('tbl')
  )
))

server <- shinyServer(function(input, output) {
  features <- reactiveValues(renderd=c(1),
                             conv=c(50),
                             inlabels=c('A'),
                             outlabels=c('B'))

  df <- eventReactive(input$goButton, {
    out <- lapply(features$renderd,function(i){
      fv <- paste0('numInp_',i)
      vn <- paste0('InLabel',i)
      data.frame(Variable=input[[vn]], Value=input[[fv]] )
    })
    do.call(rbind,out)
  })

  output$nText <- renderText({
    ntext()
  })
  output$text2 <- renderText({ 
    paste(sprintf("You have selected feature: %s", paste(features$renderd,collapse=", ")))
  })

  output$tbl <- renderTable({
    df()
  })

  # Increment reactive values array used to store how may rows we have rendered
  observeEvent(input$add,{
    out <- lapply(features$renderd,function(i){
      fv <- paste0('numInp_',i)
      vn <- paste0('InLabel',i)
      vo <- paste0('OutLabel',i)
      data.frame(inlabels=input[[vn]],outlabels=input[[vo]], conv=input[[fv]] )
    })
    df<-do.call(rbind,out)
    print(df)
    features$inlabels <- c(as.character(df$inlabels),' ')
    features$outlabels <- c(as.character(df$outlabels),' ')
    print(c(features$inlabels,features$outlabels))

    features$renderd <- c(features$renderd, length(features$renderd)+1)
    print(features$renderd)
    print(names(features))
    features$conv<-c(df$conv,51-length(features$renderd))
  })

  observeEvent(input$remove,{
    features$renderd <- features$renderd[-length(features$renderd)]
  })

  # If reactive vector updated we render the UI again
  observe({
    output$uiOutpt <- renderUI({
      # Create rows
      rows <- lapply(features$renderd,function(i){
        fluidRow(
          # duplicate choices make selectize poop the bed, use unique():
          column(4,  selectizeInput(paste0('InLabel',i), 
                                 label = 'Input Name',selected=features$inlabels[i],
                                 choices=unique(c(features$inlabels[i],features$outlabels[!features$outlabels %in% features$inlabels])),
                                 options = list(create = TRUE))),
          column(4,  sliderInput(paste0('numInp_',i), label="Conversion",min = 0, max = 100, value = features$conv[i])),
          column(4, selectizeInput(paste0('OutLabel',i), 
                                label = "Output Name", selected=features$outlabels[i],
                                choices=unique(c(features$inlabels,features$outlabels)),
                                options = list(create = TRUE)))
        )
      })
      do.call(shiny::tagList,rows)
    })
  })
})

shinyApp(ui=ui,server=server)  
库(闪亮)

ui如何制作功能和变量的数据框,例如:Feature1\t Feature2\n 55.45\t 77.68\n将其分配给某个变量名并绘制条形图?我已经添加了如何在回答中获取
data.frame
中的值。很抱歉再次出现错误。一旦我在第一个功能中输入了值,并且如果我按下“添加”按钮,第一个特征中的值将丢失,在按下“分析”之前,我如何使其永久化。我如何制作特征和变量的数据帧,如:Feature1\t Feature2\n 55.45\t 77.68\n将其指定给某个变量名并绘制条形图?例如,我已经添加了如何获取
数据中的值。框
int回答。很抱歉再次出现错误。一旦我在第一个功能中输入了值,并且当我按下“添加”按钮时,第一个功能中的值丢失,我如何在按下“分析”之前使其永久化。