R:如何基于行选择导入数据?

R:如何基于行选择导入数据?,r,shiny,R,Shiny,我知道标题不是很清楚,所以我会尽力解释我的问题 我正在编写一个应用程序,旨在从世界银行网站导入数据。为此,我使用WDI包,尤其是WDIsearch和WDI函数。前者使用您输入的单词在世界银行网站上搜索与该单词相关的指标。后者根据您在函数中输入的指示符代码导入数据 在我的应用程序中,我想首先搜索世界银行的指标。结果将显示在数据框中,第一列为指标代码,第二列为指标说明。我能够做到这一点,并显示选择。然后,我希望单击其中一行,将与该行的指示符代码相关的数据导入到新的数据框中。我知道您可以使用\u选定的

我知道标题不是很清楚,所以我会尽力解释我的问题

我正在编写一个应用程序,旨在从世界银行网站导入数据。为此,我使用
WDI
包,尤其是
WDIsearch
WDI
函数。前者使用您输入的单词在世界银行网站上搜索与该单词相关的指标。后者根据您在函数中输入的指示符代码导入数据

在我的应用程序中,我想首先搜索世界银行的指标。结果将显示在数据框中,第一列为指标代码,第二列为指标说明。我能够做到这一点,并显示选择。然后,我希望单击其中一行,将与该行的指示符代码相关的数据导入到新的数据框中。我知道您可以使用
\u选定的\u行
作为输入(基于)。问题是,我认为这段代码需要
datatable
,但是
datatable
使得无法选择列

在我的应用程序中单击“验证”后,我立即收到一条错误消息:

警告:在::l'argument est de longueur nulle中出错
(argument的长度为零或NULL,我不知道英文中的消息是什么)

下面是一个可复制的示例:

library(pacman)
pacman::p_load(shiny, WDI, DT, data.table, dplyr, shinydashboard, shinyWidgets)

ui <- dashboardPage(
  dashboardHeader(title = ""),
  dashboardSidebar(
    sidebarMenu(
      menuItem("Test", tabName = "Test")
    )),
  dashboardBody(
    tabItems(
      tabItem(tabName = "Test",
              textInput("theme_bdd",
                        "Search",
                        placeholder = "Ex : agriculture"),
              actionButton("search", 
                           "Validate"),
              br(),
              br(),
              dataTableOutput("indicators_to_select"),
              br(),
              dataTableOutput("data_imported")
      )
    ) 
  )
)


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

  indicators_to_search <- eventReactive(input$search, {
    WDIsearch(string = input$theme_bdd, field = 'name')
  })

  global <- reactiveValues(indicators_to_search = NULL)

  output$indicators_to_select <- renderDataTable({
    global$test <- data.table(indicators_to_search(), 
                                 selection = "single")
    global$test
  })

  output$data_imported <- renderDataTable({
    if(!is.null(global$test)){
      data <- global$test
      as.data.frame(WDI(country = "all", 
                        indicator = data[input$indicators_to_select_rows_selected, 1]
      )
      )
    }
  })

}

shinyApp(ui, server)
library(pacman)
pacman::p_负载(shiny、WDI、DT、data.table、dplyr、shinydashboard、shinyWidgets)

ui使用
req
而不是
if
条件。是的,它们具有相同的功能,但是
req
更易于编写和读取

此外,下载似乎需要一段时间,您可能还需要在选中行后添加加载图标

output$data_imported <- renderDataTable({
    req(global$test)
    req(input$indicators_to_select_rows_selected)
    data <- global$test
    as.data.frame(WDI(country = "all", 
                      indicator = data[input$indicators_to_select_rows_selected, 1]
})

output$data\u导入调用函数时,数据似乎还没有准备好。在反应值中使用
req
validate
,以确保它们存在。检查
https://shiny.rstudio.com/articles/req.html
I添加了
req(将$indicators\u输入到\u select\u rows\u selected)
就在
数据下方