我想在用户取消选中固定变量中的变量时,在'随机变量'中包含'固定变量'的变量。这是图像http://imgur.com/zUXEJwg。没有错误消息,只要每当我尝试取消选中任何变量时,它就不会让我这么做。 有人可以帮我这个吗?
shinyServer(function(input, output,clientData, session) {
observe({
data<-reactive({
file1<-input$file
if(is.null(file1)){return()}
read.table(file=file1$datapath, sep=input$sep,header=input$header,stringsAsFactors=input$stringsAsFactors)
})
colnames<-names(data())
updateCheckboxGroupInput(session, "Fixed", choices = colnames, selected=colnames)
inputVar<-reactive({
Fixedvar<-input$Fixed
if(is.null(Fixedvar)){return()}
subset<-data()[,!(colnames %in% Fixedvar)]
col<-names(subset)
col
})
updateCheckboxGroupInput(session, "Random", choices = inputVar())
})})
shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
fileInput("file","Please upload your file"),
checkboxInput(inputId='header', label='header', value=TRUE),
checkboxInput(inputId="stringsAsFactors", label="stringsAsFactors", value=FALSE),
radioButtons(inputId='sep',label='Separator', choices=c(Comma=',', Semicolon=';',Tab='\t',Space=''), selected=','),
fluidRow(column(6, wellPanel(
checkboxGroupInput("Fixed",
label = "Fixed Variables","")
)),
column(6, wellPanel(
checkboxGroupInput("Random", label = "Random Variables","")
) ))),
mainPanel()
)))
答案 0 :(得分:2)
问题是您只使用observe
一个。只要它内部的任何反应元素发生变化,它就会运行 - 在你的情况下,它会发生任何变化。具体来说,当您更改"Fixed"
复选框组时,此部分观察也会再次运行:
colnames<-names(data())
updateCheckboxGroupInput(session, "Fixed", choices = colnames, selected=colnames)
由于您的数据未发生变化,因此只需将您的选择和所选选项设置为colnames
即可。要绕过它,您需要使您的服务器更加模块化,具有单独的观察者和反应元素。这是适用于 server.R :
library(shiny)
shinyServer(function(input, output, session) {
data <- reactive({
file1 <- input$file
if(is.null(file1)){ return(mtcars) } # Default data for testing
read.table(file = file1$datapath, sep = input$sep, header = input$header,
stringsAsFactors = input$stringsAsFactors)
})
colnames <- reactive({ names(data()) })
observeEvent(data(), {
updateCheckboxGroupInput(session, "Fixed",
choices = colnames(), selected = colnames())
})
inputVar <- reactive({
Fixedvar <- input$Fixed
if (setequal(colnames(), Fixedvar)) {
# If sets are equal, return an empty string
return("")
} else {
# Return elements that are only in colnames
setdiff(colnames(), Fixedvar)
}
})
observeEvent(inputVar(), {
updateCheckboxGroupInput(session, "Random", choices = inputVar())
})
})
我也略微改变了inputVar
。如果在checkboxGroupInput
中未选中任何框,则会返回NULL
。因此,当input$Fixed
为NULL
时,您确实希望将"Random"
中的选项更新为所有列。
但仍然存在一个问题:无论何时在第一个输入中选中或取消选中一个方框,第二个输入都会更新。这意味着它的选择也会更新 - 未经检查的所有内容。但这有点不同的问题;我想您可以使用reactiveValues
来存储以前的"Random"
值,并在更新输入选项时将其用作初始值。
答案 1 :(得分:0)
您可能需要观察员。每当您想要评估反应式表达式,但不需要返回值时,您必须使用观察者。一些类似观察者的例子是renderXXX
函数。更多信息here。
试试这个
observe({
colnames<-names(data())
updateCheckboxGroupInput(session, "Fixed", choices = colnames, selected=colnames)
})
# ...
observe({
iv <- inputVar()
updateCheckboxGroupInput(session, "Random", choices = iv)
})