Возврат кадра данных в реактивной функции в R Shiny Dashboard - PullRequest
0 голосов
/ 21 декабря 2018

Работа с Shiny Dashboard, ui.r, server.r и несколькими сценариями 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.

Блестящий бросок и ошибка в пользовательском интерфейсе объекта '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 Ответ

0 голосов
/ 21 декабря 2018

Вы можете думать о реактивных выражениях как о функциях, которые возвращают значение.Таким образом, вы получаете ошибку 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')]
...