【问题标题】:Returning a dataframe in a reactive function in R Shiny Dashboard在 R Shiny Dashboard 的反应函数中返回数据帧
【发布时间】:2019-05-21 11:07:23
【问题描述】:

使用 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 一样返回数据框。

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"
)
})

 }

prepData

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

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

【问题讨论】:

    标签: r shiny shinydashboard shiny-reactivity


    【解决方案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')]
    

    【讨论】:

    • 在这种情况下 testdf() 仍然更像是一个函数。我正在寻找的是实际的 dataFrame 所以 testDF 我可以在其中引用 dataFrame 中的列并将其置于额外的计算标准中。例如:output$monthlyGrossDollars = renderInfoBox({ infoBox( title = "Payments", value = sum(testDF$GrossAmount), icon = icon("comments-dollar"), color = "blue" ) 在这种情况下,我可以直接访问 GrossAmount 列并对其进行求和。
    • 这就是我所缺少的,我认为这是数据框的固有回报。我正在验证结果,但这看起来是正确的,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-04-07
    • 2012-11-12
    • 2016-11-30
    • 2019-12-17
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2017-01-06
    相关资源
    最近更新 更多