【问题标题】:R Shiny can't change reactive dataframe objectR Shiny 无法更改响应式数据框对象
【发布时间】:2020-01-04 21:52:05
【问题描述】:

Shiny 应用使用 fileInput() 加载一个 .csv,但不能在后面更改它。

我想在识别列后使用按钮更改(乘以 (-1))应用程序中数据框的其中一列

对象 loadedData 是一个 read.csv() 函数,它输出我在应用程序的其余部分中使用的数据帧我尝试通过函数直接更改对象,无论是响应数据还是尝试的静态副本稍后覆盖,但似乎无法使更改永久化。

#--------------UI side
#import data
sidebarLayout( 
          sidebarPanel(

            fileInput('main', 'Input file', multiple = FALSE,
                      accept =".csv"),

            checkboxInput("header", "Header", TRUE),


            radioButtons("sep", "Separator",
                         choices = c(Comma = ",",
                                     Semicolon = ";",
                                     Tab = "\t"),
                         selected = ","),


            radioButtons("quote", "Quote",
                         choices = c(None = "",
                                     "Double Quote" = '"',
                                     "Single Quote" = "'"),
                         selected = '"')
          ),
#--------------Server Side

# read dataset 

loadedData <- reactive({
    read.csv(
      input$main$datapath,
      header = input$header,
      sep = input$sep,
      quote = input$quote
    )
  })

# change signal

observeEvent(input$main, {
    output$advancedsignalchange <- renderUI({
      tagList(
        selectInput('signalchangecolumn', 'Signal Change Column', choices = names(loadedData())),
        actionButton('signalchange','Submit signal change')
      )    
    })
    })


observeEvent(input$signalchange,{

    print(loadedData)
    print(names(loadedData()))
    aa <- as.array(input$signalchangecolumn)

    print(loadedData()[aa][[1]][1]) #token value before change

    #loadedData()[aa] <-  loadedData()[aa] *-1  ## can't override
    print(loadedData()[aa] *-1) #change 

    print(loadedData()[aa][[1]][1]) #token value after change


  })

这里有 2 个错误: 如果我取消注释此行以尝试覆盖loadedData()

loadedData()[aa] &lt;- loadedData()[aa] *-1

警告:

如果我尝试类似

loadedData[aa] &lt;- loadedData()[aa] *-1

警告:

所以我无法保存更改

打印语句是一种验证语法的方法,因此,假设我有一列第一个值为“1”,输出将是,

1

-1(连同该列的其余部分)

1

因此更改操作的语法本身是可行的,但我无法覆盖导入数据帧上的列

【问题讨论】:

标签: r shiny reactive


【解决方案1】:

要存储和更新响应式对象,您可以使用reactiveValreactiveValues 而不是reactive

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      fileInput("main", "Input file",
        multiple = FALSE,
        accept = ".csv"
      ),

      checkboxInput("header", "Header", TRUE),

      radioButtons("sep", "Separator",
        choices = c(
          Comma = ",",
          Semicolon = ";",
          Tab = "\t"
        ),
        selected = ","
      ),

      radioButtons("quote", "Quote",
        choices = c(
          None = "",
          "Double Quote" = '"',
          "Single Quote" = "'"
        ),
        selected = '"'
      )
    ),

    mainPanel(
      uiOutput("advancedsignalchange"),
      dataTableOutput("data")
    )
  )
)


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

  loadedData <- reactiveVal() # create reactive val

  observe({
    req(input$main$datapath) # make sure variable isn't empty
    loadedData(read.csv( # initialize reactiveVal
      input$main$datapath,
      header = input$header,
      sep = input$sep,
      quote = input$quote)) 
  })

  observeEvent(input$main, {
    output$advancedsignalchange <- renderUI({
      tagList(
        selectInput("signalchangecolumn", "Signal Change Column", choices = names(loadedData())),
        actionButton("signalchange", "Submit signal change")
      )
    })
  })

  observeEvent(input$signalchange, {
    aa <- as.array(input$signalchangecolumn)
    tmp <- loadedData()
    tmp[aa] <- tmp[aa] * -1
    loadedData(tmp) # update reactiveVal
  })

  output$data <- renderDataTable(loadedData()) # display data
}


shinyApp(ui, server)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 2019-12-19
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多