#r #shiny #persistent-storage
#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. Вероятно, вам нужна глобальная переменная shiny.rstudio.com/articles/scoping.html
Ответ №1:
Я бы использовал reactiveValues
для этого материал. Он работает как список, но является реактивным, поэтому вы можете изменять его на протяжении всего сеанса. Вот пример, в котором я использую его для хранения R квадратов значений, которые вычисляются на протяжении всего сеанса.
Это в основном код, который вы опубликовали выше. На сервере я включил reactiveValues
объект storage
и a 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.