В приведенном ниже приложении я не могу удалить ранее вставленный пользовательский интерфейс. Не уверен, почему. Может кто поможет................................................... .................

---
title: "Untitled"
runtime: shiny
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
---

```{r setup, include=FALSE}
library(flexdashboard)
library(rhandsontable)
```r

Column {data-width=650}
-----------------------------------------------------------------------

### Insert and Remove UI

```{r}

actionButton("add", "Add UI")
actionButton("rmv", "Remove UI")
 observeEvent(input$add, {
    insertUI(
      selector = "#add",
      where = "afterEnd",
      ui = textInput(paste0("txt", input$add),
                     "Insert some text"),multiple = FALSE
    )
  })
 observeEvent(input$rmv, {
    removeUI(
      selector = "div:has(< #txt)"
    )
  })
```

```
r
0
Dev P 8 Дек 2019 в 10:11
Спасибо. Это почти работает. но он удаляет только последнюю операцию. (Извини, я виноват). Что делать, если мне нужны все предыдущие операции? Кроме того, он удаляет только текстовое поле, а заголовок остается таким, какой он есть (он не удаляется).
 – 
Dev P
8 Дек 2019 в 11:35

1 ответ

Мы можем получить предыдущие идентификаторы, используя seq_len(input$add), где input$add равно 1,2,3,... и т. д., а затем создать jQuery с использованием paste0 и sprintf

---
title: "Untitled"
runtime: shiny
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
---

```{r setup, include=FALSE}
library(flexdashboard)
library(rhandsontable)
```

Column {data-width=650}
-----------------------------------------------------------------------

```{r}



  ### Insert and Remove UI

actionButton("add", "Add UI")
actionButton("rmv", "Remove UI")
observeEvent(input$add, {
    insertUI(
      selector = "#add",
      where = "afterEnd",
      ui = textInput(paste0("txt", input$add),
                     sprintf("Insert some text for %i",input$add)),multiple = FALSE
    )
  })
observeEvent(input$rmv, {
    removeUI(
      #Remove the last UI
      #selector = sprintf("div:has(> #txt%i)",input$add),
      #Remove all previous UIs
      selector = sprintf("div:has(%s)",paste0('> #txt', seq_len(input$add), collapse = ",")),
      immediate = TRUE,
      multiple = TRUE
    )
  })
```

Обновить

Удаляйте последний пользовательский интерфейс каждый раз, когда пользователь нажимает Удалить пользовательский интерфейс.

### Insert and Remove UI

actionButton("add", "Add UI")
actionButton("rmv", "Remove UI")
data = reactiveValues(tmp=0)
observeEvent(input$add, {
    data$tmp <- c(data$tmp,input$add)

    insertUI(
      selector = "#add",
      where = "afterEnd",
      ui = textInput(paste0("txt", input$add),
                     sprintf("Insert some text for %i",input$add)),multiple = FALSE
    )
  })

observeEvent(input$rmv, {
    rm <- tail(data$tmp, 1)
    data$tmp <- setdiff(data$tmp, rm)

    removeUI(
      #Remove the last UI
      #selector = sprintf("div:has(> #txt%i)",input$add),
      #Remove all previous UIs
      selector = sprintf("div:has(%s)",paste0('> #txt', rm, collapse = ",")),
      immediate = TRUE,
      multiple = TRUE
    )
  })
0
A. Suliman 8 Дек 2019 в 13:29
@Suliman, небольшие сомнения, когда я заменяю textInput на fileInput, почему удаление пользовательского интерфейса не работает. Это должно работать правильно?
 – 
Dev P
8 Дек 2019 в 15:21
К сожалению, это не одно и то же try fileInput("file1", "Choose CSV File", accept = c( "text/csv", "text/comma-separated-values,text/plain", ".csv") ) и textInput(paste0("txt", 1), sprintf("Insert some text for %i",1)) в R.
 – 
A. Suliman
8 Дек 2019 в 15:48
Привет, это решение? Я имею в виду, должен ли я заменить приведенный выше код?
 – 
Dev P
8 Дек 2019 в 15:52
НЕТ, textInput и fileInput имеют разные структуры HTML, как вы можете видеть, распечатывая их в консоли R. Возможно, вам следует опубликовать новый вопрос и добавить shiny и jQuery в качестве тегов.
 – 
A. Suliman
8 Дек 2019 в 15:55
Я добавил вопрос здесь stackoverflow.com/questions/59235852/…
 – 
Dev P
8 Дек 2019 в 16:26