使用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'的用户界面中引发并出错。
我尝试完成以下工作: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))
答案 0 :(得分:2)
您可以将反应表达式视为返回值的函数。因此,您将收到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')]