应用程序旨在根据Shiny应用程序中的多个输入选择创建用户上传的较大数据集的子集。 这仅适用于我的组织中使用的某种类型的txt数据文件,因此操作是特定的。
问题1:数据上传非常慢 - 文件大3.6密码行[1.3 gb] - 上传需要6分钟。有没有办法加快这个过程?
问题2:在显示“上传完成”后,应用再花2-3分钟显示数据。有没有办法减少上传和显示之间的延迟?
代码:
ui.r
library(shiny)
shinyUI(fluidPage(
tags$style(".container { border:2px solid steelblue; width: 100%; height: 450px; overflow-y: scroll; }"),
titlePanel("Truncate PSNU/Site by IM Factview data"),
fluidRow(
column(4,
wellPanel(
actionButton('selectall', 'Select All'),
uiOutput('choose_col')
)
),
column(8,
wellPanel(fluidRow(
column(6, fileInput('datafile', 'Choose CSV file', accept=c('text/csv','text/comma-separated,text/plain'))),
br(),
column(2, downloadButton('downloadData', 'Download')))),
fluidRow(
uiOutput('rowcount')
),
hr(),
fluidRow(
column(4,
uiOutput('choose_ou'),
uiOutput('choose_psnu'),
uiOutput('choose_snu_pri'),
uiOutput('choose_fa'),
uiOutput('choose_im')),
column(4,
uiOutput('choose_indi'),
uiOutput('choose_disagg'))
),
hr(),
fluidRow(DT::dataTableOutput("tab1")))
)
))
服务器
library(shiny)
library(dplyr)
library(DT)
library(shinyWidgets)
shinyServer(function(input, output, session) {
options(shiny.maxRequestSize=10000*1024^2) # set the max file size that can uploaded
# upload fn
dfip3<- reactive({
if(is.null(input$datafile))
return()
input$datafile
dfip1<-read.delim(input$datafile$datapath, header= T, stringsAsFactors = T, fileEncoding="UTF-8-BOM") # reading string as factors - works for the menu variables we need
dfip1
})
# Read & Display columns names
output$choose_col <- renderUI({
if(is.null(input$datafile))
return()
df1<-dfip3()
checkboxGroupInput('show_vars', "Select Columns", names(df1), selected = names(df1), width = 500)
})
# Select all / Unselect all for Columns
observeEvent(input$selectall,{
if(is.null(input$show_vars)){
updateCheckboxGroupInput(session = session, inputId = "show_vars", choices=names(dfip3()), selected = names(dfip3()))
}
else {updateCheckboxGroupInput(session = session, inputId = "show_vars", choices=names(dfip3()), selected = "")}
})
# Replace na in PSNU with 'Blank'
dfip2<- reactive({
if(is.null(input$datafile))
return()
p<- dfip3()
levels(p$PSNU)[levels(p$PSNU)==""] <- "Blank"
p$PSNU<-gsub('_', '', paste(p$PSNU))
return(p)
})
# Replace na in SNU_Prioritization
dfip4<- reactive({
if(is.null(input$datafile))
return()
j<- dfip2()
levels(j$FY16SNUPrioritization)[levels(j$FY16SNUPrioritization)==""] <- "Blank"
return(j)
})
dfip5<- reactive({
if(is.null(input$datafile))
return()
j<- dfip4()
j$standardizedDisaggregate[is.na(j$standardizedDisaggregate)==TRUE]<- 'Blank'
return(j)
})
# Paste space in front of age to stop DT & excel from reaing it as date
dfip<- reactive({
if(is.null(input$datafile))
return()
c1<-dfip5()
c1$Age<-paste(" ", c1$Age)
return(c1)
})
# OU drop-down menu
output$choose_ou <- renderUI({ # create reactive ui element inside server, which will called in ui
if(is.null(input$datafile)) # necessary to avoid NULL error before data is uploaded
return()
ou_UP<-sort(as.vector(unique(dfip()$OperatingUnit))) # create a list of unique Operating units
selectInput('check1', "choosen ou", ou_UP) # initiate selectInput for dropdown
dropdownButton(
label = "Select OU", status = "default", width = 200, circle = F,
tags$div(
class='container',
actionButton(inputId = "all1", label = "Select all"),
checkboxGroupInput(inputId = "check1", label = "Choose", paste(ou_UP))
)
)
})
# Select all / Unselect all for OU
observeEvent(input$all1, {
if (is.null(input$check1)) {
ou_UP<-sort(as.vector(unique(dfip()$OperatingUnit)))
updateCheckboxGroupInput(
session = session, inputId = "check1", selected = paste(ou_UP)
)} else {
updateCheckboxGroupInput(
session = session, inputId = "check1", selected = "")}
})
# Indicator Drop-down menu
dfindi<- reactive({
if(is.null(input$datafile))
return()
v<-dfip()
levels(v$indicator)[levels(v$indicator)=='']<-'Blank'
return(v)
})
output$choose_indi <- renderUI({
if(is.null(input$datafile))
return()
indi_UP<-sort(as.vector(unique(dfindi()$indicator)))
selectInput('check2', "choosen indi", indi_UP)
dropdownButton(
label = "Select Indicator(s)", status = "default", width = 400,circle = F,
tags$div(
class='container',
actionButton(inputId = "all2", label = "Select all"),
checkboxGroupInput(inputId = "check2", label = "Choose", paste(indi_UP))
))
})
# Select all / Unselect all for Indicator
observeEvent(input$all2, {
if (is.null(input$check2)) {
indi_UP<-sort(as.vector(unique((dfindi()$indicator))))
# indi_UP<-sort(indi_UP)
updateCheckboxGroupInput(
session = session, inputId = "check2", selected = paste(indi_UP)
)} else {updateCheckboxGroupInput(session = session, inputId = "check2", selected = "")}
})
# PSNU drop-down menu
output$choose_psnu <- renderUI({
if(is.null(input$check1))
return()
d1 = filter(dfip(), OperatingUnit %in% input$check1)
psnu <- sort(as.vector(unique(d1$PSNU)))
dropdownButton(
label = "Select PSNU", status = "default", width = 150, circle = F,
tags$div(
class='container',
actionButton(inputId = "all3", label = "Select all"),
checkboxGroupInput(inputId = "check3", label = "Choose", paste(psnu), selected = paste(psnu)
)))
})
## PSNU select-all
observeEvent(input$all3, {
if (is.null(input$check3)) {
d1 = filter(dfip(), OperatingUnit %in% input$check1)
psnu <- sort(as.vector(unique(d1$PSNU)))
updateCheckboxGroupInput(
session = session, inputId = "check3", selected = paste(psnu)
)} else {
updateCheckboxGroupInput(
session = session, inputId = "check3", selected = "")}
})
## FY16-SNU Prioritization Dropdown menu
output$choose_snu_pri <- renderUI({
if(is.null(input$check3))
return()
d2 = filter(dfip(), PSNU %in% input$check3)
snuP <- as.list(unique(as.character(d2$FY16SNUPrioritization)))
dropdownButton(
label = "Select FY16SNU_Prioritization", status = "default", width = 150,circle = F,
actionButton(inputId = "all4", label = "Select all"),
checkboxGroupInput(inputId = "check4", label = "Choose", paste(snuP), selected = paste(snuP))
)
})
## FY16-SNU Prioritization select-all
observeEvent(input$all4, {
if (is.null(input$check4)) {
d2 = filter(dfip(), PSNU %in% input$check3)
snuP <- as.list(unique(as.character(d2$FY16SNUPrioritization)))
updateCheckboxGroupInput(
session = session, inputId = "check4", selected = paste(snuP)
)
} else {
updateCheckboxGroupInput(
session = session, inputId = "check4", selected = ""
)
}
})
## Funding Agency drop-down menu
output$choose_fa <- renderUI({
if(is.null(input$check3))
return()
dfa = filter(dfip(), PSNU %in% input$check3)
fa <- sort(as.vector(unique(dfa$FundingAgency)))
dropdownButton(
label = "Select Funding Agency", status = "default", width = 150, circle = F,
tags$div(
class='container',
actionButton(inputId = "all5", label = "Select all"),
checkboxGroupInput(inputId = "check5", label = "Choose", paste(fa), selected = paste(fa))
))
})
## FUNDING AGENCY select - all
observeEvent(input$all5, {
if (is.null(input$check5)) {
dfa = filter(dfip(), PSNU %in% input$check3)
fa <- sort(as.vector(unique(dfa$FundingAgency)))
updateCheckboxGroupInput(
session = session, inputId = "check5", selected = paste(fa)
)
} else {
updateCheckboxGroupInput(
session = session, inputId = "check5", selected = ""
)
}
})
## IMPLEMENTATION MECHANISM drop-down menu
output$choose_im <- renderUI({
if(is.null(input$check5))
return()
dfim = filter(dfip(), FundingAgency %in% input$check5)
im <- sort(as.vector(unique(dfim$ImplementingMechanismName)))
dropdownButton(
label = "Select Implementation Mechanism", status = "default", width = 250, circle = F,
tags$div(
class='container',
actionButton(inputId = "all6", label = "Select all"),
checkboxGroupInput(inputId = "check6", label = "Choose", paste(im), selected = paste(im))
))
})
## IMPLEMENTATION MECHANISM select-all
observeEvent(input$all6, {
if (is.null(input$check6)) {
dfim = filter(dfip(), FundingAgency %in% input$check5)
im <- sort(as.vector(unique(dfim$ImplementingMechanismName)))
updateCheckboxGroupInput(
session = session, inputId = "check6", selected = paste(im)
)
} else {
updateCheckboxGroupInput(
session = session, inputId = "check6", selected = ""
)
}
})
# Standardized Disaggregate drop-down menu
output$choose_disagg <- renderUI({
if(is.null(input$check2))
return()
dfdis = filter(dfip(), indicator %in% input$check2)
# levels(dfdis$standardizedDisaggregate)[levels(dfdis$standardizedDisaggregate)==""]<- Blank
dis <- sort(as.vector(unique(dfdis$standardizedDisaggregate)))
dropdownButton(
label = "Select Standardized Disagg", status = "default", width = 300, circle = F,
tags$div(
class='container',
actionButton(inputId = "all7", label = "Select all"),
checkboxGroupInput(inputId = "check7", label = "Choose", paste(dis), selected = paste(dis))
))
})
observeEvent(input$all7, {
if (is.null(input$check7)) {
dfdis = filter(dfip(), indicator %in% input$check2)
dis <- sort(as.vector(unique(dfdis$standardizedDisaggregate)))
updateCheckboxGroupInput(
session = session, inputId = "check7", selected = paste(dis)
)
} else {
updateCheckboxGroupInput(
session = session, inputId = "check7", selected = ""
)
}
})
# subset data based on selections in the drop down menu
df2<- reactive({
if(is.null(input$datafile))
return()
a2<- dfip()
return(filter(a2, OperatingUnit %in% input$check1, indicator %in% input$check2, standardizedDisaggregate %in% input$check7
, PSNU %in% input$check3
, FY16SNUPrioritization %in% input$check4
, FundingAgency %in% input$check5
, ImplementingMechanismName %in% input$check6
))
})
#subset data based on selection of columns
df3<- reactive({
d <- df2()[, input$show_vars] # show_vars is input id of column checkbox
return(d)
})
# Display data table based on selections in dropdown menu & columns
output$tab1<- renderDataTable({
df2()[, input$show_vars, drop=FALSE]
})
output$rowcount<- renderText({
paste("Number of rows:",format(nrow(df2()), big.mark=",", scientific=FALSE))
})
# Choose df3() and download the file
output$downloadData <- downloadHandler(
filename = function() {
paste("PSNU_IM", '.csv', sep='')
},
content = function(file) {
write.csv(df3(), file, row.names = F)
}
示例数据 - 20行:
structure(list(Region = c(65733L, 67133L, 14543L, 54687L, 91556L,
67548L, 12805L, 34652L, 90933L, 13016L, 1560L, 39464L, 51166L,
56750L, 90676L, 1524L, 29893L, 83771L, 48861L, 55702L), RegionUID = c("Africa",
"Africa", "Africa", "Africa", "Africa", "Asia", "Africa", "Africa",
"Africa", "Africa", "Africa", "Africa", "Africa", "Africa", "Africa",
"Africa", "Africa", "Africa", "Africa", "Africa"), OperatingUnit = c("KSkooYTy8FB",
"KSkooYTy8FB", "KSkooYTy8FB", "KSkooYTy8FB", "KSkooYTy8FB", "NTRKjfU2iaF",
"KSkooYTy8FB", "KSkooYTy8FB", "KSkooYTy8FB", "KSkooYTy8FB", "KSkooYTy8FB",
"KSkooYTy8FB", "KSkooYTy8FB", "KSkooYTy8FB", "KSkooYTy8FB", "KSkooYTy8FB",
"KSkooYTy8FB", "KSkooYTy8FB", "KSkooYTy8FB", "KSkooYTy8FB"),
OperatingUnitUID = c("Zambia", "Nigeria", "Nigeria", "Nigeria",
"Nigeria", "Indonesia", "Democratic Republic of the Congo",
"Democratic Republic of the Congo", "Kenya", "Kenya", "Tanzania",
"Tanzania", "Nigeria", "Tanzania", "Ethiopia", "Ethiopia",
"Ethiopia", "Nigeria", "Ethiopia", "Ethiopia"), CountryName = c("f5RoebaDLMx",
"PqlFzhuPcF1", "PqlFzhuPcF1", "PqlFzhuPcF1", "PqlFzhuPcF1",
"W73PRZcjFIU", "ANN4YCOufcP", "ANN4YCOufcP", "HfVjCurKxh2",
"HfVjCurKxh2", "mdXu6iCbn2G", "mdXu6iCbn2G", "PqlFzhuPcF1",
"mdXu6iCbn2G", "IH1kchw86uA", "IH1kchw86uA", "IH1kchw86uA",
"PqlFzhuPcF1", "IH1kchw86uA", "IH1kchw86uA"), SNU1 = c("jSxiOw",
"rYLPdL", "XhOL82", "IHxdmk", "Gyn9NL", "UvccS2", "fgcS9V",
"4Vjs88", "hdhZFA", "7sqHkr", "eofHGG", "5NGFII", "M0jScU",
"W5s41A", "TFPaDW", "jMwcxH", "FGSZN0", "AzXoAb", "9wZC11",
"FVdc2S"), SNU1Uid = c("n7z24e", "YU0t5N", "oWwkk9", "k3wfRQ",
"ql1hSF", "ZG1tDi", "gW8ec8", "kv7WvO", "1fAuCg", "NpBy6V",
"xX0h1X", "Ar75oW", "gKdHQL", "EUXT3C", "HMM3MF", "KlUkQR",
"CRvdyK", "qJS2dX", "9WZZAx", "8ZcQPD"), PSNU = c("ZP7sUNCemnF",
"EuopELCVYdk", "H7zZFfHCS3p", "DB9jvKNvPXU", "ek80rI6DFKt",
"y3tfgiE9hci", "ZUY45BaAesB", "hIPJyWupajj", "IXd4gNSP0rY",
"dOyNJKWeT7C", "gscKZEtokgV", "kLhRnbNgmQo", "mWutl8clHfY",
"gscKZEtokgV", "soLrT2pgsfR", "qgDA8IKI21g", "KokO4spc5GQ",
"ERH1gaeZSqG", "TKzAS3aEDPE", "LHy7xJAXLWw"), PSNUuid = c("e1GuGfjysgx",
"XDgdj9Pdsiq", "yQa2xS9x96u", "L589JlvsLup", "ljMQwl1DOCb",
"KWgDpbnndTO", "pCODWiMvHX4", "IIWUbCKztLZ", "I5jmTunFZY2",
"A0BC4zSGPwM", "D3hgNLc7wl6", "QcLi8vhV1cZ", "bT2GvywtrWr",
"olUCraJY2gF", "kawLNa3krso", "YS8RTnVtDgy", "yB1DGw59cc1",
"sWKNZPZj231", "vBKoXrr7QYj", "WZTnlbCMnWE"), FY16SNUPrioritization = c("e1GuGfjysgx",
"XDgdj9Pdsiq", "yQa2xS9x96u", "L589JlvsLup", "ljMQwl1DOCb",
"KWgDpbnndTO", "pCODWiMvHX4", "IIWUbCKztLZ", "I5jmTunFZY2",
"A0BC4zSGPwM", "D3hgNLc7wl6", "QcLi8vhV1cZ", "bT2GvywtrWr",
"olUCraJY2gF", "kawLNa3krso", "YS8RTnVtDgy", "yB1DGw59cc1",
"sWKNZPZj231", "vBKoXrr7QYj", "WZTnlbCMnWE"), FY17SNUPrioritization = c("4 - Sustained",
"4 - Sustained", "4 - Sustained", "4 - Sustained", "1 - Scale-Up: Saturation",
"NULL", "4 - Sustained", "1 - Scale-Up: Saturation", "4 - Sustained",
"2 - Scale-Up: Aggressive", "1 - Scale-Up: Saturation", "4 - Sustained",
"4 - Sustained", "2 - Scale-Up: Aggressive", "4 - Sustained",
"6 - Sustained: Commodities", "1 - Scale-Up: Saturation",
"4 - Sustained", "6 - Sustained: Commodities", "1 - Scale-Up: Saturation"
), typeMilitary = c("2 - Scale-Up: Aggressive", "4 - Sustained",
"4 - Sustained", "4 - Sustained", "7 - Attained", "1 - Scale-Up: Saturation",
"4 - Sustained", "1 - Scale-Up: Saturation", "4 - Sustained",
"1 - Scale-Up: Saturation", "1 - Scale-Up: Saturation", "4 - Sustained",
"4 - Sustained", "1 - Scale-Up: Saturation", "4 - Sustained",
"4 - Sustained", "1 - Scale-Up: Saturation", "4 - Sustained",
"5 - Centrally Supported", "1 - Scale-Up: Saturation"), MechanismUID = c(NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_), PrimePartner = c("mcbx",
"Pqs0", "UBC7", "Fn0R", "wNya", "pzG8", "QX2D", "IhF1", "wUcI",
"awOq", "8O0r", "I2DS", "N2tB", "rAyn", "fv7z", "iuet", "WChd",
"vINr", "2eNy", "l9LS"), FundingAgency = c("pF1U", "6gAZ",
"kfIK", "CoxK", "rP6f", "imCE", "mZaZ", "722t", "gKrz", "dWZS",
"MEhz", "llf4", "ORYU", "0Wz3", "qthq", "dyYe", "2lgU", "D9tK",
"djOh", "B6qs"), MechanismID = c("NASYB", "DYRHF", "ZJXFT",
"KIZJN", "VETUP", "CGQWJ", "JIZQB", "AYXKY", "DSVKL", "XWXSR",
"NDSVZ", "MQXRQ", "YWDIQ", "NUSXE", "YKKWB", "WYBYQ", "PVIFB",
"IGCGY", "SFVMH", "LSAAD"), ImplementingMechanismName = c(13580L,
16871L, 16871L, 17727L, 16848L, 17600L, 13476L, 13730L, 13868L,
13481L, 16763L, 14680L, 17727L, 16784L, 17000L, 16749L, 14228L,
0L, 16901L, 1L), indicator = c("BWMQHC", "XMWZCA", "EQFOQE",
"XNDEOE", "AJPZFV", "QTGBCI", "MNSBLI", "DVRXLW", "OFKDKB",
"CHJTFU", "SNBNXY", "IMKRTP", "ESBFKQ", "AKTIMB", "FFZESI",
"IUAXRH", "NQYDPF", "MPOLSB", "VHCVBZ", "HZTBZG"), numeratorDenom = c("CARE_CURR",
"TB_OUTCOME", "TB_ART", "HTC_TST", "HTC_TST", "HTC_TST",
"TX_RET", "TX_NEW", "TB_SCREEN", "TB_OUTCOME", "TX_RET",
"HTC_TST", "TB_STAT", "KP_PREV", "TB_STAT", "TB_SCREENDX",
"HTC_TST", "GEND_NORM", "PP_PREV", "PP_PREV"), indicatorType = c("N",
"N", "N", "N", "N", "N", "D", "N", "N", "N", "D", "N", "N",
"N", "N", "N", "N", "N", "N", "N"), disaggregate = c("TA",
"DSD", "DSD", "DSD", "DSD", "TA", "DSD", "DSD", "TA", "DSD",
"DSD", "DSD", "DSD", "DSD", "TA", "DSD", "DSD", "DSD", "DSD",
"TA"), categoryOptionComboName = c("Age/Sex", "Sex/Outcome",
"ART", "Results", "ServiceDeliveryPoint/Result", "ServiceDeliveryPoint/Result",
"Age/Sex", "Preg/Feeding", "Age", "Age/Outcome", "Total Denominator",
"ServiceDeliveryPoint/Result", "Age", "Keypop2017", "Result",
"Aggregated Age/Sex", "Age/Sex/Result", "Total Numerator",
"Age/Sex", "Age/Sex"), Age = c("Female, <1", "Male, Not Evaluated",
"< 8", "Positive", "Positive, Tuberculosis", "Negative, Outpatient Department",
"<5, Male", "Pregnant", "9-May", "20+, Cured", "default",
"Positive, Outpatient Department", "<1", "MSM not SW", "Negative",
"<15, Male", "20-24, Female, Positive", "default", "50+, Female",
"25-49, Female"), Sex = c("<01", NA, NA, NA, NA, NA, "<05",
NA, "9-May", "20+", NA, NA, "<01", NA, NA, "<15", "20-24",
NA, "50+", "25-49"), resultStatus = c("Female", "Male", NA,
NA, NA, NA, "Male", NA, NA, NA, NA, NA, NA, NA, NA, "Male",
"Female", NA, "Female", "Female"), otherDisaggregate = c(NA,
NA, NA, "Positive", "Positive", "Negative", NA, NA, NA, NA,
NA, "Positive", NA, NA, "Negative", NA, "Positive", NA, NA,
NA), coarseDisaggregate = c(NA, "Not Evaluated", "< 8", NA,
"Tuberculosis", "Outpatient Department", NA, "Pregnant",
NA, "Cured", NA, "Outpatient Department", NA, "MSM not SW",
NA, NA, NA, NA, NA, NA), FY2015Q2 = c(NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, TRUE, NA, NA, NA,
NA), FY2015Q3 = c(0L, 0L, 0L, 253L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 11L, 0L, 0L, 0L, 0L, 0L), FY2015Q4 = c(0L,
0L, 0L, 214L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 7L, 0L, 0L, 1L,
0L, 0L, 0L, 0L, 0L), FY2015APR = c(0L, 0L, 0L, 296L, 0L,
0L, 2L, 1L, 0L, 0L, 4540L, 7L, 0L, 0L, 17L, 0L, 0L, 0L, 0L,
0L), FY2016_TARGETS = c(0L, 0L, 0L, 763L, 0L, 0L, 2L, 1L,
0L, 0L, 4540L, 14L, 0L, 0L, 29L, 0L, 0L, 0L, 0L, 0L), FY2016Q1 = c(0L,
0L, 8L, 0L, 129L, 0L, 0L, 0L, 0L, 5L, 4880L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, -20L), FY2016Q2 = c(0L, 0L, 0L, 235L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L), FY2016Q3 = c(0L, 0L, 0L, 207L, 0L, 268L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 14L, 0L, 1L, 0L, 0L, 0L), FY2016Q4 = c(0L,
0L, 0L, 145L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 13L,
0L, 0L, 0L, 0L, 0L), FY2016APR = c(0L, 0L, 0L, 138L, 0L,
0L, 0L, 0L, 0L, 0L, 4806L, 0L, 0L, 0L, 15L, 0L, 0L, 0L, 0L,
0L), FY2017_TARGETS = c(0L, 0L, 0L, 725L, 0L, 268L, 0L, 0L,
0L, 0L, 4806L, 0L, 0L, 0L, 42L, 0L, 1L, 0L, 0L, 0L)), .Names = c("Region",
"RegionUID", "OperatingUnit", "OperatingUnitUID", "CountryName",
"SNU1", "SNU1Uid", "PSNU", "PSNUuid", "FY16SNUPrioritization",
"FY17SNUPrioritization", "typeMilitary", "MechanismUID", "PrimePartner",
"FundingAgency", "MechanismID", "ImplementingMechanismName",
"indicator", "numeratorDenom", "indicatorType", "disaggregate",
"categoryOptionComboName", "Age", "Sex", "resultStatus", "otherDisaggregate",
"coarseDisaggregate", "FY2015Q2", "FY2015Q3", "FY2015Q4", "FY2015APR",
"FY2016_TARGETS", "FY2016Q1", "FY2016Q2", "FY2016Q3", "FY2016Q4",
"FY2016APR", "FY2017_TARGETS"), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame"))