library(shiny)
ui <- fluidPage(
checkboxGroupInput("data", "Select data:",
c("Iris" = "iris",
"Cars" = "mtcars")),
plotOutput("myPlot")
)
server <- function(input, output) {
dat <- reactive({
switch()
})
output$myPlot <- renderPlot({
dat <- switch(input$data,
"iris" = iris,
"mtcars" = mtcars)
plot(Sepal.Width ~ Sepal.Length, data = get(input$data))
})
}
shinyApp(ui, server)
上面是一个简单的应用程序,提示用户选择一个数据集,然后使用数据集绘制图形。我想修改它,以便用户可以指定一些值t
,它也会传递到plot
语句中。
library(shiny)
ui <- fluidPage(
checkboxGroupInput("data", "Select data:",
c("Iris" = "iris",
"Cars" = "mtcars")),
sidebarLayout(
sidebarPanel(
sliderInput("t",
"Scale:",
min = -5,
max = 5,
value = 2, step = 1,
width = "100%")
),
mainPanel( plotOutput("myPlot"))
)
)
server <- function(input, output) {
dat <- reactive({
switch()
})
output$myPlot <- renderPlot({
t = input$t
dat <- switch(input$data,
"iris" = iris,
"mtcars" = mtcars)
plot(Sepal.Width ~ Sepal.Length * t, data = get(input$data))
})
}
shinyApp(ui, server)
但是,我收到以下错误声明:variable lengths differ (found for 't')
。我希望实现的是将t
列附加到用户输入数据集。我试过dat$t = t
,但似乎没有用。
答案 0 :(得分:0)
如果您在formula
(Sepal.Width ~ Sepal.Length * t
)内进行计算,则需要use I() to bracket the portions of the formula where the operators are used in their arithmetic sense:
plot(Sepal.Width ~ I(Sepal.Length * t), data = get(input$data))
更新:如果您想对数据进行多种操作,我建议创建一个反应函数(dat
)来根据用户输入计算数据,并且然后使用data.frame
返回的dat()
对象作为绘图中的输入数据:
server <- function(input, output) {
dat <- reactive({
if (input$data == "iris") {
df <- iris
# Do any calculations based on user input (here input$t)
df$Sepal.Length <- df$Sepal.Length * input$t
}
df
})
output$myPlot <- renderPlot({
plot(Sepal.Width ~ Sepal.Length, data = dat())
})
}
要使这个工作跨多个数据集,让dat()函数重命名依赖(Sepal.Width
iris
,mtcars
中的其他内容)和独立({{1}在Sepal.Length
)中,例如iris
和y
然后在您的绘图中使用x
(或为每个数据集编写单独的绘图函数)。