निम्नलिखित चमकदार ऐप पर विचार करें, जो मैं करना चाहता हूं:

  1. एक इनपुट फ़ील्ड है seed एक डिफ़ॉल्ट मान के साथ
  2. seed वैरिएबल के लिए क्वेरी स्ट्रिंग देखें
  3. यदि मान मौजूद नहीं है, तो डिफ़ॉल्ट मान का उपयोग करके रेंडर करें।
  4. यदि मान मौजूद है, तो आउटपुट को डिफ़ॉल्ट मान के साथ प्रस्तुत न करें; इसके बजाय, क्वेरी स्ट्रिंग मान का उपयोग करें

दूसरे शब्दों में, मैं प्रारंभिक प्रतिपादन की प्रतीक्षा करना चाहता हूं जब तक कि मैंने यह सुनिश्चित करने के लिए जांच नहीं की है कि क्वेरी स्ट्रिंग फ़ील्ड के लिए कोई नया डिफ़ॉल्ट मान निर्दिष्ट नहीं करती है।

---
output: html_document
runtime: shiny
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

values = reactiveValues(checked_query = FALSE)
```
```

```{r}
textInput("seed", label = "Seed:", width = "150px", value = "s33d")
```

```{r}
observeEvent(input$seed, {
    query = getQueryString()
    seed = query[['seed']]
    
    if (!is.null(seed)) {
      updateTextInput(session, 'seed', value = seed)
    }else{
      values$checked_query = TRUE
    }
    
}, once = TRUE)
```

```{r}

renderUI({
  
  # if(!values$checked_query) return(HTML("Please wait..."))
  
  htmltools::tags$h3(input$seed, style="color: red;")
})
```

अगर मैं एक यूआरएल के साथ कोड चलाता हूं जिसमें ?seed=38543 है, तो यह बहुत संक्षेप में s33d के साथ पेज दिखाएगा और फिर 38543 पर स्विच कर देगा। यदि क्वेरी स्ट्रिंग चर seed मौजूद है, तो मैं इसे s33d के प्रारंभिक प्रतिपादन से रोकना चाहता हूं।

जैसा कि आप देख सकते हैं, मैंने इस पर checked_query नामक एक प्रतिक्रियाशील मान के साथ एक प्रारंभिक प्रयास किया है। यदि आप renderUI() फ़ंक्शन में पहली पंक्ति को असम्बद्ध करते हैं, तो यह प्रारंभिक रेंडरिंग को सफलतापूर्वक अवरुद्ध कर देगा यदि क्वेरी स्ट्रिंग मान मौजूद है, और यदि ऐसा नहीं है तो सफलतापूर्वक प्रारंभिक मान प्रस्तुत करता है, लेकिन मुझे यकीन नहीं है कि कैसे बनाना है यह क्वेरी स्ट्रिंग मान में अद्यतन करता है।

अगर मैं डालता हूँ

values$checked_query = TRUE

updateTextInput के ठीक बाद, renderUI का अपडेट बहुत तेजी से होता है और मुझे अभी भी s33d दिखाई देता है।

कोई भी विचार क्वेरी स्ट्रिंग मान को डिफ़ॉल्ट मान के रूप में कैसे उपयोग करें, लेकिन केवल तभी मौजूद है?

1
richarddmorey 31 जिंदा 2021, 00:21

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि सबसे आसान काम रनटाइम पर इनपुट बॉक्स को भी खींचना है। सीधे टेक्स्ट इनपुट करने के बजाय, उपयोग करें

uiOutput("seedbox")

और फिर जोड़ें

output$seedbox <- renderUI({
  query = getQueryString()
  seed = if ('seed' %in% names(query)) query[['seed']] else "s33d"
  textInput("seed", label = "Seed:", width = "150px", value = seed)
})

इस तरह बॉक्स को पहली बार सही मान के साथ खींचा जाएगा और इसे बदलने की आवश्यकता नहीं होगी। तो आपको observeEvent(input$seed, {...}) ब्लॉक या checked_query मान की आवश्यकता नहीं होगी

1
MrFlick 31 जिंदा 2021, 02:12