请提前感谢。我正在尝试将其缩小,但是我是Shinny的新手,所以我很难将其缩小。我的主要混乱是反应性与其他类型的反应性(?)结构。
我要做的是列出R基本数据软件包。我在一个选择的盒子里有那个。这样可行。选择该数据后,R将显示该数据集的字段,以便用户可以接受Y和X值。(我意识到有些集合并没有为此格式。)下面列出的代码给出了主面板中的"尺寸不正确"。错误似乎在调用名称的某个地方。我似乎不明白如何在创造性之后将反应性元素进入UI。有什么提示吗?
再次,数据集列表起作用。数据表已正确拉出。但是名称不存在,因此可以选择它们来构建图。
library(shiny)
set.seed(10101)
dataPkgs <- data(package='datasets')[[3]]
pkgNames <- dataPkgs[,3]
ui <- fluidPage(
headerPanel('R Data k-means clustering'),
sidebarPanel(
selectInput('choosedata', 'Choose a Data Set',pkgNames,selected="mtcars"),
helpText("Listing should make available all basic datasets available in base R install.
Remember many of the data sets will be ill-fit for this type of analysis."),
selectInput('ycol', 'Select Independent Y', textOutput('selDFNames')),
selectInput('xcol', 'Select Dependent X', textOutput('selDFNames')),
numericInput('clusters', '1-7 clusters', 3,
min = 1, max = 7)
),
mainPanel(
plotOutput('plot1')
)
)
server <- function(input, output, session) {
selDF <- renderTable({
get(input$choosedata)
})
output$selDFNames <- renderText({
names(selDF())
})
selDFset <- reactive({
selDF()[, c(input$xcol, input$ycol)]
})
clusters <- reactive({
kmeans(selDFset(), input$clusters)
})
output$plot1 <- renderPlot({
plot(selDFset(),
col = clusters()$cluster,
pch = 20, cex = 3)
points(clusters()$centers, pch = 4, cex = 4, lwd = 4)
})
}
shinyApp(ui = ui, server = server)
我会添加更多的测试用例,并抓住我的答案,但是如果您获得知道工作的数据集,而不仅仅是要求所有数据集:
library(shiny)
set.seed(10101)
dataPkgs <- data(package='datasets')[[3]]
pkgNames <- dataPkgs[,3]
longley[,c("GNP.deflator","GNP.deflator")]
ui <- fluidPage(
headerPanel('R Data k-means clustering'),
sidebarPanel(
selectInput('choosedata', 'Choose a Data Set',pkgNames,selected="mtcars"),
helpText("Listing should make available all basic datasets available in base R install.
Remember many of the data sets will be ill-fit for this type of analysis."),
selectInput('ycol', 'Select Independent Y', choices = NULL),
selectInput('xcol', 'Select Dependent X', choices = NULL),
numericInput('clusters', '1-7 clusters', 3,min = 1, max = 7)
),
mainPanel(
plotOutput('plot1')
)
)
server <- function(input, output, session) {
selDF <- reactive({
data <- tryCatch(get(input$choosedata), error=function(e) NULL)
if(is.null(data)){
return()
}
data
})
observeEvent(selDF(),{
updateSelectInput(session,"xcol",choices=c(names(selDF())))
updateSelectInput(session,"ycol",choices=c(names(selDF())))
})
selDFset <- eventReactive(c(input$xcol, input$ycol),{
req(input$xcol)
req(input$ycol)
selDF()[,c(input$xcol, input$ycol)]
})
clusters <- reactive({
kmeans(selDFset(), input$clusters)
})
output$plot1 <- renderPlot({
req(selDFset())
plot(selDFset(),col = clusters()$cluster,pch = 20, cex = 3)
points(clusters()$centers, pch = 4, cex = 4, lwd = 4)
})
}
shinyApp(ui = ui, server = server)
使用observe
,updateSelectInput
更新您的选择输入。这是服务器功能,效果很好。祝你好运。
server <- function(input, output, session) {
selDF <- reactive({
get(input$choosedata, envir = as.environment('package:datasets'))
})
observe({
updateSelectInput(session, "ycol", choices = names(selDF()))
})
observe({
updateSelectInput(session, "xcol", choices = names(selDF()))
})
selDFset <- reactive({
selDF()[, c(input$xcol, input$ycol)]
})
clusters <- reactive({
kmeans(selDFset(), input$clusters)
})
output$plot1 <- renderPlot({
plot(selDFset(),
col = clusters()$cluster,
pch = 20, cex = 3)
points(clusters()$centers, pch = 4, cex = 4, lwd = 4)
})
}
shinyApp(ui = ui, server = server)