Постоянное хранение данных в R блестящем
Я разрабатываю приложение (это урезанная версия), где пользователь может загрузить .csv
файл и выполнить некоторые автоматизированные вычисления (в этом случае просто простая линейная модель для получения r.squared
значение). Как будет большое количество .csv
Таблицы, чтобы пройти (каждый может иметь уникальное имя), мне было интересно, можно ли будет сохранить все r.squared
значения в одной сводной таблице (вторая вкладка), которую затем можно экспортировать как одну .csv
файл, как только все файлы были пройдены (мне удобно с кнопкой действия, чтобы сделать эту последнюю часть.
У меня есть два варианта рабочего процесса:
- Несколько файлов (или папка может быть загружена одновременно)
- Каждый файл загружается индивидуально
ui.R
library(shiny)
ui <- fluidPage(
navbarPage("Menu",inverse=TRUE,fluid=TRUE,collapsible=TRUE,selected = "Data input",
tabPanel("Data input",
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Choose CSV File',
accept=c('text/csv',
'text/comma-separated-values,text/plain',
'.csv')),
tags$hr(),
checkboxInput('header', 'Header', TRUE),
radioButtons('sep', 'Separator',
c(Comma=',',
Semicolon=';',
Tab='\t'),
','),
radioButtons('quote', 'Quote',
c(None='',
'Double Quote'='"',
'Single Quote'="'"),
'"')
),
mainPanel(
tableOutput('contents')
)
)),
tabPanel("Summary",fluidRow(
column(6,
tableOutput("summary"))))
))
server.R
server <- function(input, output) {
mydata<-reactive({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
data<-read.csv(inFile$datapath, header=input$header, sep=input$sep,
quote=input$quote)
data
})
output$contents <- renderTable({
mydata()
})
output$summary <- renderTable({
m<-lm(mydata()[,1]~mydata()[,2])
summary(m)$r.squared
})
}
shinyApp(ui, server)
1 ответ
Я хотел бы использовать reactiveValues
для этого материала. Он работает как список, но реагирует, так что вы можете изменить его на протяжении всего сеанса. Вот пример, где я использую его для хранения значений R в квадрате, которые рассчитываются на протяжении сеанса.
Это в основном код, который вы разместили выше. На сервере я включил reactiveValues
объект storage
и observeEvent
который просто добавляет storage$Rsquared
по квадрату R всякий раз, когда mdata()
переоценен.
Это просто базовый пример. Добавляя условия в observeEvent
Вы можете сделать это более изощренным. Или, может быть, вы хотите собрать больше, чем просто числовое значение, тогда вы бы поместили другой тип структуры данных в reactiveValue
,
щ
ui <- fluidPage(
navbarPage("Menu",inverse=TRUE,fluid=TRUE,collapsible=TRUE,selected = "Data input",
tabPanel("Data input",
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Choose CSV File', accept=c('text/csv', 'text/comma-separated-values,text/plain', '.csv')),
tags$hr(),
checkboxInput('header', 'Header', TRUE),
radioButtons('sep', 'Separator', c(Comma=',', Semicolon=';', Tab='\t'),','),
radioButtons('quote', 'Quote', c(None='', 'Double Quote'='"', 'Single Quote'="'"),'"')
),
mainPanel(
tableOutput('contents')
)
)
),
tabPanel( "Summary", fluidRow(column(6, tableOutput("summary"))))
))
сервер
server <- function(input, output)
{
storage <- reactiveValues(Rsquared = numeric())
mydata <- reactive({
inFile <- input$file1
if(is.null(inFile)) return(NULL)
data<-read.csv(inFile$datapath, header = input$header, sep = input$sep, quote = input$quote)
data
})
output$contents <- renderTable({
mydata()
})
observeEvent(mdata(),{
m <- lm(mydata()[,1]~mydata()[,2])
storage$Rsquared <- append(storage$Rsquared, summary(m)$r.squared)
})
output$summary <- renderTable(storage$Rsquared)
}
Затем вы можете добавить функцию загрузки для пользователя, чтобы сохранить все значения R в квадрате, которые он создал. Функция загрузки будет использовать storage$Rsquared
и запишите его в.csv, например.