Возврат кадра данных в реактивной функции в R Shiny Dashboard
Работа с Shiny Dashboard, ui.r, server.r и несколькими скриптами, которые содержат функции.
Основная проблема заключается в следующем: у меня есть два набора данных, которые я ввожу в server.r, и я передаю их в функцию, которая подготавливает / очищает наборы данных, а затем связывает их вместе и возвращает полный кадр данных. DataFrame должен быть реактивным. Вот что у меня так далеко:
В server.r я загружаю данные до функции (вход, выход, сессия). Тогда у меня есть:
################server.r code #########################
data <- reactive({
testDF <- prepData(data1, data2)
})
Функция prepData делает множество вещей, но заканчивается:
####################prepData function return#################
return(rbind(data1, data2))
Если я использую что-то вроде:
############## server.r code#######################
value = nrow(data()),
Затем код возвращает правильное значение. Однако я бы предпочел просто вернуть фрейм данных, как я делал с testDF.
Shiny выбросит и ошибка в интерфейсе объекта 'testDF' не найдена.
Я попытался проработать: Как мне построить реактивный фрейм данных в R / Shiny? используя код:
dataR <- prepData(data1, data2)
makeReactiveBinding(dataR)
Это все равно выдает ошибку. Функция явно работает и была проверена, но должно быть что-то, чего я не понимаю в реактивном компоненте использования этой функции. Любая помощь будет оценена. Спасибо!
server.ui
function(input, output, session) {
### PreProcess the Data
data <- reactive({
testDF <- prepData(bdata, qdata)
})
#dataR <- prepData(bData, qData)
#makeReactiveBinding(dataR)
### Information Box Populations
output$monthlytransactions = renderInfoBox({
infoBox(
title = "Payments",
value = nrow(data()),
icon = icon("comments-dollar"),
color = "blue"
)
})
output$monthlyGrossDollars = renderInfoBox({
infoBox(
title = "Payments",
value = sum(testDF$GrossAmount),
icon = icon("comments-dollar"),
color = "blue"
)
})
}
prepData
############# FUNCTIONS ##############
prepData <- function(beamData, qlawData){
##Processing##
#Join DFs
return(rbind(bData, qData))
1 ответ
Вы можете думать о реактивных выражениях как о функциях, которые возвращают значение. Итак, вы получаете object 'testDF' not found
ошибка, потому что testDF
существует только в рамках data
реактивный объект (функция).
Когда вы создаете реактивное выражение:
data <- reactive({
testDF <- prepData(bdata, qdata)
})
на самом деле вы создаете функцию, которая возвращает значение. В этом случае вы запускаете prepData()
сохранить результат в объекте testDF
и затем неявно возвращает это значение (поскольку R неявно возвращает значение последней строки функции). Вы получаете доступ к этому значению, вызывая data()
, так как это имя реактивного выражения, которое возвращает ваше значение, а не testDF
, поскольку этот объект удаляется после завершения работы функции.
Если ты хочешь testDF
содержать результат prepData
просто измените имя реактивного выражения следующим образом:
testDF <- reactive({
prepData(bdata, qdata)
})
testDF() # this will return the value you want
Вызов реактивного выражения на самом деле возвращает фрейм данных, который вы можете установить на подмножество и работать с ним как обычно. Таким образом, вы можете работать с ним как с фреймом данных (но не забывайте о скобках!):
data()$GrossAmount
data()[data()$GrossAmount > 100, c('name', 'date')]