在 R Shiny Dashboard 的反应函数中返回数据框
Returning a dataframe in a reactive function in R Shiny Dashboard
使用 Shiny Dashboard、ui.r、server.r 和几个包含函数的 r 脚本。
基本问题是:我有两个数据集,我将它们带入 server.r,然后将它们传递给 prepares/cleanses 数据集的函数,然后将它们绑定在一起,应该 return 一个完整的数据框。 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()),
那么代码 return 就是正确的值。但是,我更喜欢 return 数据框,就像我对 testDF 所做的那样。
Shiny 将在 UI 对象 'testDF' 未找到时抛出错误。
我试过:
使用代码:
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))
您可以将反应式表达式视为 return 一个值的函数。所以你得到了 object 'testDF' not found
错误,因为 testDF
只存在于 data
反应对象(函数)的范围内。
当您创建反应式表达式时:
data <- reactive({
testDF <- prepData(bdata, qdata)
})
您实际做的是创建一个 return 值的函数。在这种情况下,您 运行 prepData()
,将结果保存在对象 testDF
中,然后隐式地 return 该值(因为 R 隐式地 returns 的值函数的最后一行)。您可以通过调用 data()
来访问该值,因为那是 return 是您的值的反应表达式的名称,而不是 testDF
,因为一旦函数完成该对象就会被删除 运行宁.
如果您希望 testDF
包含 prepData
的结果,只需像这样更改响应式表达式的名称:
testDF <- reactive({
prepData(bdata, qdata)
})
testDF() # this will return the value you want
调用反应式表达式 实际上 return 一个数据框,您可以像往常一样对其进行子集化和使用。所以你可以像使用数据框一样使用它(但不要忘记括号!):
data()$GrossAmount
data()[data()$GrossAmount > 100, c('name', 'date')]
使用 Shiny Dashboard、ui.r、server.r 和几个包含函数的 r 脚本。
基本问题是:我有两个数据集,我将它们带入 server.r,然后将它们传递给 prepares/cleanses 数据集的函数,然后将它们绑定在一起,应该 return 一个完整的数据框。 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()),
那么代码 return 就是正确的值。但是,我更喜欢 return 数据框,就像我对 testDF 所做的那样。
Shiny 将在 UI 对象 'testDF' 未找到时抛出错误。
我试过:
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))
您可以将反应式表达式视为 return 一个值的函数。所以你得到了 object 'testDF' not found
错误,因为 testDF
只存在于 data
反应对象(函数)的范围内。
当您创建反应式表达式时:
data <- reactive({
testDF <- prepData(bdata, qdata)
})
您实际做的是创建一个 return 值的函数。在这种情况下,您 运行 prepData()
,将结果保存在对象 testDF
中,然后隐式地 return 该值(因为 R 隐式地 returns 的值函数的最后一行)。您可以通过调用 data()
来访问该值,因为那是 return 是您的值的反应表达式的名称,而不是 testDF
,因为一旦函数完成该对象就会被删除 运行宁.
如果您希望 testDF
包含 prepData
的结果,只需像这样更改响应式表达式的名称:
testDF <- reactive({
prepData(bdata, qdata)
})
testDF() # this will return the value you want
调用反应式表达式 实际上 return 一个数据框,您可以像往常一样对其进行子集化和使用。所以你可以像使用数据框一样使用它(但不要忘记括号!):
data()$GrossAmount
data()[data()$GrossAmount > 100, c('name', 'date')]