我在Shiny中创建了一个简单的系统,它包含一个textBox和下面的一些复选框。我希望用户将他的ID输入到textBox中,系统会自动生成一个文件名,文件名与用户ID相同。我的意思是如果用户输入" 1234Q"作为他的ID,系统将生成一个名为" 1234Q"的文件。到目前为止,我已经完成了以下工作:
#part of the ui.R file
library(shiny)
shinyUI(fluidPage(
titlePanel(h2("Title")),
###textbox for entering person data
textInput("text2", label = h3("Personal ID"), value = ""),
verbatimTextOutput("textBoxvalue"),
hr(),
mainPanel(
textOutput("text1"),
#some checkboxes here
actionButton("action", label = "Next")
)
))
和我的server.R大致如下:
sw=0
shinyServer(function(input, output, session) {
output$textBoxvalue <- renderPrint({ input$text2 })
observe({
fileNameData<-renderText({ input$text2 })
fileName<<-paste(fileNameData(),sep=".","txt")
})
if (sw==0){
#some operations here
cat(someData,file=fileName,append=TRUE,sep=",") #save data
我遇到的问题是,在用户输入他的ID之后,我将该数据输入到fileName变量中,我打算用它来保存我将在if(sw == 0)部分之后获得的数据,但没有任何反应。对于我所看到的程序绕过观察部分并直接评估if(sw == 0)部分。我尝试使用隔离,没有运气。我该怎么做才能解决这个问题?
更新
我做了类似以下的事情:
shinyServer(function(input, output, session) {
###data received from the textbox, we need to save a file with this name only once
####observe
observe({
fileNameData<-renderText({ input$text2 })
#print(fileNameData())
fileName<<-paste(fileNameData(),sep=".","txt")
})
isolate({
###end of data received from the textbox
if (sw==0){
大致工作正常,但我错过了第一个要输入的数据,因为我的文件名是空的。
PD。总而言之,我只需要用户输入文本字段的文本值,然后创建一个具有相同名称的文件。这个过程应该只进行一次。
答案 0 :(得分:1)
如果您想将if(sw==0{...}
的执行链接到'input$text2
,那么isolate
就是您的选择。您需要将if ..
包裹在isolate
中,并将其放在观察者中以触发它。所以这应该有用
observe({
fileNameData<-renderText({ input$text2 })
fileName<<-paste(fileNameData(),sep=".","txt")
isolate ({
if (sw==0){
#some operations here
cat(someData,file=fileName,append=TRUE,sep=",") #save data
}
})
})
现在isolate()
位于观察者的内部,只应在input$text2
更改时触发。