Возврат кадра данных в реактивной функции в 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')]
Другие вопросы по тегам