首页 > 解决方案 > 数据框 - R - 闪亮

问题描述

我对 Shiny 和数据框的使用有疑问。

我想我明白我需要创建隔离或反应性的环境来与之交互,但是如果我尝试使用 Dataframe,我会收到一条错误消息:

Error in pfData: konnte Funktion "pfData" nicht finden

我试图通过这段代码来操作数据框:

server <- function(input, output) {
observeEvent(input$go,
           {
             pf_name <- reactive({input$pfID})
             pf_date <- reactive({input$pfDate})

             if (pf_name()!="please select a PF") {
               
               pfData <- reactive(read.csv(file =paste(pf_name(),".csv",sep=""),sep=";",dec=","))
               MDur <- pfData()[1,15]
               pfData <- pfData()[3:nrow(pfData()),]
               Total = sum(pfData()$Eco.Exp...Value.long)

               }
           })
}

如果我在控制台中操作我的数据框,它就可以正常工作:

pfData <- pfData[3:nrow(pfData),]
Total = sum(pfData$Eco.Exp...Value.long)
Assets = sum(as.numeric(gsub(",",".",gsub(".","",pfData$Value,fixed=TRUE),fixed=TRUE)))
pfData$Exposure <- with(pfData, Eco.Exp...Value.long /Total)

你能帮助我吗?

编辑:

 library(shiny)

ui <- fluidPage(

  
fluidRow(
  
        column(6, offset =3,
               wellPanel(
                 "Choose Mandate and Date",
                         fluidRow(
                           column(4,selectInput("pfID",label = "",
                                                       choices = list("please select a PF","GF25", 
                                                                      "FPM"),
                                                       selected = "please select a PF") ), 
                                  column(4,   dateInput("pfDate",label="",value = Sys.Date())  ),
                           column(2,  actionButton("go","Submit")),column(2,textOutput("selected_var"))
                           )
                        )
              )
      )

)

# Define server logic ----
server <- function(input, output) {
  
  pfDataReactive <- reactive({
    input$go
    if (pf_name()!="please select a PF") {
      pfData <- read.csv(file =paste(pf_name(),".csv",sep=""),sep=";",dec=",")
      MDur <- pfData[1,15]
      pfData <- pfData[3:nrow(pfData),]
      Total = sum(pfData$Eco.Exp...Value.long)
      Assets = sum(as.numeric(gsub(",",".",gsub(".","",pfData$Value,fixed=TRUE),fixed=TRUE)))
      pfData$Exposure <- with(pfData, Eco.Exp...Value.long /Total)
      pfData
      output$selected_var <- renderText({paste(MDur)})
      }
  })
  
  

}

# Run the app ----
shinyApp(ui = ui, server = server)

谢谢斯特凡

标签: rdataframeshiny

解决方案


如果没有一个可行的例子,就不可能确定你想要做什么,但听起来你需要 areactive而不是使用observeEvent.

尝试类似的东西

pfDataReactive <- reactive({
  input$go
  pfData <- read.csv(file =paste(pf_name(),".csv",sep=""),sep=";",dec=",")
  Total = sum(pfData$Eco.Exp...Value.long)
  Assets = sum(as.numeric(gsub(",",".",gsub(".","",pfData$Value,fixed=TRUE),fixed=TRUE)))
  pfData$Exposure <- with(pfData, Eco.Exp...Value.long /Total)
  pfData
})

然后在您在控制台代码中pfDataReactive()引用的任何地方使用 Shiny 应用程序的服务器功能。pfData

独立的参考input$go确保响应式将在input$go更改/单击/等时更新。

更新

您的代码仍然存在重大问题。作为我给你的最后一行,你已经为输出对象添加了一个赋值reactive,所以reactive总是返回NULL。这没有帮助,也是它“根本不活跃”的原因之一......

其次,您测试是否存在pf_name在相关输入对象出现时调用的反应/函数input$pfIDreactive这是永远不会更新的另一个原因。

input$pfID请注意我为提高对象的可读性而对定义所做的更改pfDataReactive。(此更改也可能意味着您可以完全取消input$go。)

正如您所说,我无权访问您的 csv 文件,因此无法完全测试您的代码。我已经修改了的主体,pfDataReactive只是将mtcars数据集作为字符串返回。我还编辑了我注释掉的代码,希望当您将它与真正的csv 文件一起使用时可以正确运行。

此代码似乎给出了您想要的行为。不过,如果我可以发表主观评论,我认为您的 GUI 布局令人震惊。;=)

library(shiny)

ui <- fluidPage(
  fluidRow(
    column(6, offset =3,
           wellPanel(
             "Choose Mandate and Date",
             fluidRow(
               column(4,selectInput("pfID",label = "",
                                    # Modified to that "Pleaseselect a PF" returns NULL
                                    choices = list("please select a PF"="","GF25",  "FPM"),
                                    selected = "please select a PF") ), 
               column(4,   dateInput("pfDate",label="",value = Sys.Date())  ),
               column(2,  actionButton("go","Submit")),column(2,textOutput("selected_var"))
             )
           )
    )
  )
)

# Define server logic ----
server <- function(input, output) {
  pfDataReactive <- reactive({
    # Don't do anything until we have a PF csv file
    req(input$pfID)
    
    input$go
    # Note the change to the creation of the file name
      # pfData <- read.csv(file =paste(input$pfID,".csv",sep=""),sep=";",dec=",")
      # pfData <- pfData[3:nrow(pfData),]
      # Total = sum(pfData$Eco.Exp...Value.long)
      # Assets = sum(as.numeric(gsub(",",".",gsub(".","",pfData$Value,fixed=TRUE),fixed=TRUE)))
      # pfData$Exposure <- with(pfData, Eco.Exp...Value.long /Total)
      # MDur <- pfData[1,15]
      # If you want to print MDur in the selected_var output, MDur should be the retrun value from this reactive
      # MDur
      mtcars
  })
  
  output$selected_var <- renderText({
    print("Yep!")
    as.character(pfDataReactive())
  })
}

# Run the app ----
shinyApp(ui = ui, server = server)

下一次,拜托,拜托,更加努力地提供一个MWE。 这篇文章可能会有所帮助。

是对 Shiny 的一个很好的介绍。


推荐阅读