在闪亮的应用程序中将数据帧从外部函数传递到服务器
passing dataframe from outside function to server in shiny app
我想将我的 dataframe 从函数 summ()
发送到服务器函数。我正在 summ()
函数中执行所有操作{operationsi am not showing} 最后 dataframes
准备好了。在服务器中,我想使用名为 df
和 df1
的数据框绘制两个单独的图形。
谁能帮我如何将这些数据帧从 summ
函数发送到 shiny。
library(shiny)
library(ggplot2)
ui<-fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput(inputId = "Y",label = "Price", value = 2, min =1,max = 6),
sliderInput(inputId = "d_km",label = "Distance", value = 5, min =1,max = 20),
sliderInput(inputId = "fact",label = "Multiplication", value = 2, min =1,max = 5),
actionButton(inputId = "button", label = "Simulate")
),
mainPanel(
plotOutput("X"),
plotOutput("HH")
)
)
)
summ<-function(Y,d_km,fact)
{
### code ###
df <- data.frame("x"=x,"y1"=y1,"y2"=y2)
df1<- data.frame("obj"=obj_vector)
returns <- list(plot = df, plots=df1)
}
server<-function(input, output,session){
default_list <- list(plot = df, plots=df1)
# daf <- data.frame()
rv<-reactiveValues(data=default_list)
rv$data <- reactive(summ (input$Y, input$d_km, input$fact))
frame <- eventReactive(input$button, {
returned <- rv$data()
cost <- returned$plot
})
frame1 <- eventReactive(input$button, {
returned <- rv$data()
coost <- returned$plots
})
output$X <- renderPlot({
ggplot(frame(), aes(x)) + # basic graphical object
geom_line(aes(y=y1), colour="red") + # first layer
geom_line(aes(y=y2), colour="green")+
xlab("Bag_no.")+ylab("Price in USD")+
geom_text(aes(y=y1,label=y1),size=3,angle=45)
})
output$HH <- renderPlot({
ggplot(frame1(),aes(x=seq(1,runs,1),y=obj_vector))+geom_line(colour="blue")+
xlab("Simulation_run")+ylab("Objective_value")
# grid.arrange(p1,p2,ncol=2)
})
}
shinyApp(ui = ui, server = server)
感谢您的帮助。
- 在您的
server
中,您使用 df
和 df1
定义了 default_list
,它们在您的全局或服务器的本地环境之前或之后都没有定义。此外,即使在使用 reactiveValues()
将其分配给 rv
之后,您实际上也没有使用 default_list
,因此我在您的应用程序中看不到 default_list
的目标。如果您的程序中仍然需要它,您可以像下面这样替换它:
default_list <- list(plot = c(), plots = c())
- 在服务器中
frame
和 frame1
是函数,它们被假定为 return smth。
所以你可以这样改变它:
frame <- eventReactive(input$button, {
returned <- rv$data()
cost <- returned$plot
cost # <= Add This
})
frame1 <- eventReactive(input$button, {
returned <- rv$data()
coost <- returned$plots
coost # <= And This
})
- 在
output$HH
可视化中,您使用的变量 runs
没有在您的应用程序中的任何地方定义,您需要事先定义它才能使用(也许您已经在您没有定义的代码中定义了它显示,但现在它会导致错误)。
- 再次在
output$HH
中使用 y = object_vector
,但在 summ()
中将其分配给 data.frame('obj' = object_vector)
,因此您需要像这样更改代码:
或在summ()
中:
data.frame('object_vector' = object_vector)
在 output$HH
中:
y = obj
我想将我的 dataframe 从函数 summ()
发送到服务器函数。我正在 summ()
函数中执行所有操作{operationsi am not showing} 最后 dataframes
准备好了。在服务器中,我想使用名为 df
和 df1
的数据框绘制两个单独的图形。
谁能帮我如何将这些数据帧从 summ
函数发送到 shiny。
library(shiny)
library(ggplot2)
ui<-fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput(inputId = "Y",label = "Price", value = 2, min =1,max = 6),
sliderInput(inputId = "d_km",label = "Distance", value = 5, min =1,max = 20),
sliderInput(inputId = "fact",label = "Multiplication", value = 2, min =1,max = 5),
actionButton(inputId = "button", label = "Simulate")
),
mainPanel(
plotOutput("X"),
plotOutput("HH")
)
)
)
summ<-function(Y,d_km,fact)
{
### code ###
df <- data.frame("x"=x,"y1"=y1,"y2"=y2)
df1<- data.frame("obj"=obj_vector)
returns <- list(plot = df, plots=df1)
}
server<-function(input, output,session){
default_list <- list(plot = df, plots=df1)
# daf <- data.frame()
rv<-reactiveValues(data=default_list)
rv$data <- reactive(summ (input$Y, input$d_km, input$fact))
frame <- eventReactive(input$button, {
returned <- rv$data()
cost <- returned$plot
})
frame1 <- eventReactive(input$button, {
returned <- rv$data()
coost <- returned$plots
})
output$X <- renderPlot({
ggplot(frame(), aes(x)) + # basic graphical object
geom_line(aes(y=y1), colour="red") + # first layer
geom_line(aes(y=y2), colour="green")+
xlab("Bag_no.")+ylab("Price in USD")+
geom_text(aes(y=y1,label=y1),size=3,angle=45)
})
output$HH <- renderPlot({
ggplot(frame1(),aes(x=seq(1,runs,1),y=obj_vector))+geom_line(colour="blue")+
xlab("Simulation_run")+ylab("Objective_value")
# grid.arrange(p1,p2,ncol=2)
})
}
shinyApp(ui = ui, server = server)
感谢您的帮助。
- 在您的
server
中,您使用df
和df1
定义了default_list
,它们在您的全局或服务器的本地环境之前或之后都没有定义。此外,即使在使用reactiveValues()
将其分配给rv
之后,您实际上也没有使用default_list
,因此我在您的应用程序中看不到default_list
的目标。如果您的程序中仍然需要它,您可以像下面这样替换它:
default_list <- list(plot = c(), plots = c())
- 在服务器中
frame
和frame1
是函数,它们被假定为 return smth。 所以你可以这样改变它:
frame <- eventReactive(input$button, {
returned <- rv$data()
cost <- returned$plot
cost # <= Add This
})
frame1 <- eventReactive(input$button, {
returned <- rv$data()
coost <- returned$plots
coost # <= And This
})
- 在
output$HH
可视化中,您使用的变量runs
没有在您的应用程序中的任何地方定义,您需要事先定义它才能使用(也许您已经在您没有定义的代码中定义了它显示,但现在它会导致错误)。 - 再次在
output$HH
中使用y = object_vector
,但在summ()
中将其分配给data.frame('obj' = object_vector)
,因此您需要像这样更改代码:
或在summ()
中:
data.frame('object_vector' = object_vector)
在 output$HH
中:
y = obj