在R闪亮仪表板的反应函数中返回数据帧仪表板、函数、反应、数据

2023-09-03 14:00:36 作者:未完待续

使用闪亮的仪表板、ui.r、server.r和几个包含函数的r脚本。

基本问题是:我有两个数据集要带到服务器中。r我将它们传递给一个函数,准备/清理数据集,然后将它们绑定在一起,应该返回一个完整的数据帧。DataFrame应该是反应性的。以下是我到目前为止的情况:

在服务器中。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’的UI中找不到错误。

我尝试使用:How do I build a reactive dataframe in 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"
)
})

 }

准备数据

############# FUNCTIONS ##############
prepData <- function(beamData, qlawData){ 

##Processing##
#Join DFs
return(rbind(bData, qData))

推荐答案

您可以将反应式表达式视为返回值的函数。因此,您会收到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')]