#r #shiny
#r #блестящий
Вопрос:
Я новичок в R-Shiny, и мой вопрос может быть очень простым. После нескольких часов размышлений и поиска я не смог решить проблему. Вот в чем проблема:
1) Мое приложение просит пользователя загрузить свой набор данных.
2) Затем в файле сервера я прочитал набор данных, провел некоторые анализы и передаю результаты в пользовательский интерфейс.
3) Мой пользовательский интерфейс имеет 4 разных вывода.
4) Я считываю набор данных в функции «render» для каждого вывода. ПРОБЛЕМА: при этом данные определяются локально в области видимости каждой функции, что означает, что мне нужно перечитывать их для каждого вывода.
5) Это очень неэффективно, есть ли какая-либо альтернатива? использование reactive ?
6) Ниже приведен пример кода, показывающий, как я написал свой сервер.R:
shinyServer(function(input, output) {
# Interactive UI's:
# %Completion
output$myPlot1 <- renderPlot({
inFile <- input$file
if (is.null(inFile)) return(NULL)
data <- read.csv(inFile$datapath, header = TRUE)
# I use the data and generate a plot here
})
output$myPlot2 <- renderPlot({
inFile <- input$file
if (is.null(inFile)) return(NULL)
data <- read.csv(inFile$datapath, header = TRUE)
# I use the data and generate a plot here
})
})
Как я могу просто получить входные данные один раз и просто использовать их в своих выходных функциях?
Большое спасибо,
Ответ №1:
Вы можете вызвать данные из файла в reactive
функции. Затем к нему можно получить доступ, например, как myData()
в других reactive
функциях:
library(shiny)
write.csv(data.frame(a = 1:10, b = letters[1:10]), 'test.csv')
runApp(list(ui = fluidPage(
titlePanel("Uploading Files"),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Choose CSV File',
accept=c('text/csv',
'text/comma-separated-values,text/plain',
'.csv'))
),
mainPanel(
tableOutput('contents')
)
)
)
, server = function(input, output, session){
myData <- reactive({
inFile <- input$file1
if (is.null(inFile)) return(NULL)
data <- read.csv(inFile$datapath, header = TRUE)
data
})
output$contents <- renderTable({
myData()
})
}
)
)
Комментарии:
1. Привет @jdharrison, большое спасибо за ваш ответ. Я действительно пробовал это, но получаю сообщение об ошибке, что «объект типа ‘closure’ не поддается подстановке» .
2. Пожалуйста, обратите внимание, что позже я в своих функциях визуализации буду ссылаться на «myData» и буду использовать некоторые столбцы данных через оператор $. Я получаю указанную выше ошибку каждый раз, когда использую столбец типа myData $ col1.
3. Для меня работает нормально. Доступ к столбцу будет осуществляться так,
myData()$col1
однако обычно вы сначала делаете что-то вродеmydata <- myData()
first в своей реактивной функции.