【问题标题】:R shiny - perform seperate operations on loaded data with action buttonsR shiny - 使用操作按钮对加载的数据执行单独的操作
【发布时间】:2021-01-02 06:04:09
【问题描述】:

我是 R shiny 的新手,我正在尝试开发一个可以上传文件并合并数据的应用程序。到目前为止,这是我的代码:

library(shiny)
library(DT)
library(leaflet)
library(tidyverse)
library(reshape2)

ui <- fluidPage(
  fileInput('SNP_raw_data', 'Choose SNP_raw_data to upload', accept = c('.csv')),
  fileInput('GPS_raw_data', 'Choose GPS_raw_data to upload', accept = c('.csv')),
  actionButton('long2wide_table_button', 'Show conversion long2wide as table'),
  actionButton('samples_map_button', 'Show map of listed samples'),
  DT::dataTableOutput("long2wide_table"),
  uiOutput("samples_map")
)

server <- function(input, output) {
  
  df_SNP_upload <- reactive({
    inFile_SNP <- input$SNP_raw_data
    if (is.null(inFile_SNP))
      return(NULL)
    df_SNP <- read.csv(inFile_SNP$datapath, header = TRUE,sep = input$separator)
    return(df_SNP)
  })
  
  df_GPS_upload <- reactive({
    inFile_GPS <- input$GPS_raw_data
    if (is.null(inFile_GPS))
      return(NULL)
    df_GPS <- read.csv(inFile_GPS$datapath, header = TRUE,sep = input$separator)
    return(df_GPS)
  })
  
  conversion_long2wide <- eventReactive(input$long2wide_table_button, {
    data_arranged <- df_SNP_upload() %>%
      select(ID, Assay, Name, Converted) %>%
      arrange(Assay)
    data_mutated <- data_arranged %>%
      mutate(data_arranged, Converted = gsub(":", "", data_arranged$Converted))
    NameID <- paste(data_arranged$Name, data_arranged$ID)
    Name_ID_long <- gsub(" ", "_", NameID)
    Name_ID <- gsub("....$", "", Name_ID_long)
    data_combined <- data_mutated[,c(2,4)] %>%
      add_column(Name_ID, .after=1)
    convA <- mutate(data_combined, Converted = gsub("A", "01", data_combined$Converted))
    convC <- mutate(convA, Converted = gsub("C", "02", convA$Converted))
    convG <- mutate(convC, Converted = gsub("G", "03", convC$Converted))
    convT <- mutate(convG, Converted = gsub("T", "04", convG$Converted))
    data_na <- mutate(convT, Converted = gsub("No 02all", "0000", convT$Converted))
    order0201 <- mutate(data_na, Converted = gsub("0201", "0102", data_na$Converted))
    order0301 <- mutate(order0201, Converted = gsub("0301", "0103", order0201$Converted))
    order0302 <- mutate(order0301, Converted = gsub("0302", "0203", order0301$Converted))
    order0401 <- mutate(order0302, Converted = gsub("0401", "0104", order0302$Converted))
    order0402 <- mutate(order0401, Converted = gsub("0402", "0204", order0401$Converted))
    order0403 <- mutate(order0402, Converted = gsub("0403", "0304", order0402$Converted))
    data_converted <- dcast(order0403, formula = Name_ID ~ Assay, value.var = "Converted")
    NameNameID <- data_mutated %>%
      add_column(Name_ID, .after=3) %>%
      select(Name, Name_ID) %>%
      unique() %>%
      rename(Sample_ID = Name) %>%
      arrange(Name_ID)
    Sample_ID <- NameNameID$Sample_ID
    data_converted2 <- data_converted %>%
      add_column(Sample_ID, .after = 1)
    coords_selected <- df_GPS_upload() %>%
      mutate(coordinates, Sample_ID = gsub(" ", "", coordinates$Sample_ID)) %>%
      select(Sample_ID, Population, Latitude, Longitude)
    data_joined <- left_join(data_converted2, coords_selected, by = "Sample_ID") %>%
      relocate(Population, .after = Name_ID) %>%
      relocate(Latitude, .after = Population) %>%
      relocate(Longitude, .after = Latitude)
    SNPs_Coords <- select(data_joined, -5)
    return(SNPs_Coords)
  })
  
  output$long2wide_table <- DT::renderDataTable({
    conversion_long2wide()
  })

  output$samples_map_button <- renderUI({
    
  })
}


shinyApp(ui = ui, server = server)

文件输入运行良好。但是,之后我想通过使用操作按钮对数据执行一些操作,例如“long2wide_table_button”。这不知何故不起作用,也许我不确定如何正确连接这些功能。 conversion_long2wide() 被认为是集成的中心枢纽,我认为就像其他应用程序中的 data() 一样。它应该提供一个数据框,我想通过按下操作按钮在该数据框上执行进一步的操作,例如映射或统计。 Conversion_long2wide 作为单独的脚本运行良好,但在集成到应用程序时会导致错误警告,例如“列 ID 不存在”或“未找到函数 select()”,即使它们存在。这是要上传的 SNP 数据示例:

        ID           Assay  Name Converted
1  S06-A01 LL_A1_01275_308  R289       A:G
2  S95-A01 LL_A1_01275_308  R419       A:G
3  S05-A01 LL_A1_01275_308  P573       A:G
4  S94-A01 LL_A1_01275_308  R345       A:A
5  S04-A01 LL_A1_01275_308  P098       A:G
6  S93-A01 LL_A1_01275_308  R337       G:G
7  S03-A01 LL_A1_01275_308 N0509       G:G
8  S92-A01 LL_A1_01275_308  R328       A:G
9  S02-A01 LL_A1_01275_308 N0494       A:G
10 S91-A01 LL_A1_01275_308  R320       G:G

...以及 GPS 数据:

    Sample_ID  Population  Latitude Longitude
234      P573 Poland_east 52,814444 23,643333
353       R419 Russia_northeast   66,888081  136,176853
264       R289      Russia_west   59,988323   47,909056
303       R345      Russia_west   60,816269   48,402507
223      P098  Poland_east   52,891802    23,51427
295       R337      Russia_west   60,816269   48,402507
198     N0509       Norway   63,134665    8,477809
286       R328      Russia_west    59,80816   50,419522
183     N0494       Norway   60,611573     8,49342
278       R320      Russia_west    59,80816   50,419522

非常感谢!

【问题讨论】:

  • 数据请提供dput,这样使用更方便

标签: r shiny action-button


【解决方案1】:

input$GPS_raw_data 返回一个 data.frame,其中包含读取数据所需的信息。您使用此信息读取所选文件并将其存储在反应式df_GPS_upload 中。因此,您可以访问此对象中的数据:

conversion_long2wide <- eventReactive(input$long2wide_table_button, {
      data_arranged <- df_GPS_upload() %>%
            select(ID, Assay, Name, Converted) %>%
            arrange(Assay)
      return(data_arranged)
}

因为df_GPS_upload是反应式,所以需要使用df_GPS_upload()来访问数据。

select_ 错误可能来自您尝试将其应用于input$GPS_raw_data 的事实,如果您使用上面的代码,看看它是否会消失。总的来说,tidyverseshiny 不存在兼容性问题。

【讨论】:

  • 亲爱的starja,感谢您的回复!现在有一个新的错误警告:不能对不存在的列进行子集化。 x 列 ID 不存在。 167: 但是这个列肯定存在于我的原始数据中。拼写是相同的,并且在一个单独的脚本中它可以工作......非常奇怪
  • 尝试在上面的代码中包含一个browser() 来检查它。另外,请发布带有一些示例数据的可重现示例(运行闪亮的应用程序),以便我们可以更好地为您提供帮助
  • 好的,我已经用完整的代码和一些示例数据更新了我的帖子。
猜你喜欢
  • 2018-01-26
  • 2021-02-10
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多