R当一个修改另一个时,如何确定最近修改的反应式表达式?

R当一个修改另一个时,如何确定最近修改的反应式表达式?,r,user-interface,shiny,reactive-programming,R,User Interface,Shiny,Reactive Programming,基本上,我有一个多选择输入的层次结构,称它们为a、b和c,大小(a)>大小(b)>大小(c)。b的每个单位都属于a的一个单位,c的每个单位都属于b的一个单位。当你从a中删除某些东西时,它会从b中删除相应的东西,而b又会从c中删除相应的东西 我需要做的是确定用户上次修改的多选输入。我在这里遵循这个结果,但它不起作用,因为如果我修改a,它会修改b,然后修改c,结果会是程序认为用户修改了c 我的问题是,有没有办法区分用户输入和常规更新调用 第二个问题可能是,有没有办法提前确定被动表达式将解决的顺序?例

基本上,我有一个多选择输入的层次结构,称它们为a、b和c,大小(a)>大小(b)>大小(c)。b的每个单位都属于a的一个单位,c的每个单位都属于b的一个单位。当你从a中删除某些东西时,它会从b中删除相应的东西,而b又会从c中删除相应的东西

我需要做的是确定用户上次修改的多选输入。我在这里遵循这个结果,但它不起作用,因为如果我修改a,它会修改b,然后修改c,结果会是程序认为用户修改了c

我的问题是,有没有办法区分用户输入和常规更新调用

第二个问题可能是,有没有办法提前确定被动表达式将解决的顺序?例如,我注意到,如果我从a或b中删除很多值,它将解决一次删除一个值的问题,然后继续从较低的层次结构中删除这些值。我之前预计它会交替出现(从b中删除,从c中删除对应项,从b中删除,从c中删除对应项等等),但事实并非如此

下面是一个例子,您可以运行代码,您将看到当您编辑一个或两个选择时,它将快速闪烁“一”或“二”,但它将始终重置为“三”。例外情况是,当您删除列表中的最后一项时,由于某种原因,该项不会更新其下方的级别

library("shiny")
one = vector(mode="list", length = 4)
names(one) = c("a","b","c","d")
two = vector(mode="list", length = 8)
names(two) = c("e","f","g","h","i","j","k","l")
three = vector(mode="list", length = 16)
three = c("m","n","o","p","q","r","s","t","u","v","w","x","y","z","aa","ab")
one[["a"]] = c("e","f")
one[["b"]] = c("g","h")
one[["c"]] = c("i","j")
one[["d"]] = c("k","l")
two[["e"]] = c("m","n")
two[["f"]] = c("o","p")
two[["g"]] = c("q","r")
two[["h"]] = c("s","t")
two[["i"]] = c("u","v")
two[["j"]] = c("w","x")
two[["k"]] = c("y","z")
two[["l"]] = c("aa", "ab")
ui = fluidPage(
    titlePanel("Example"),
    sidebarLayout(
        sidebarPanel(
            selectInput("selectOne", label="Select One:", choices=names(one), selected = names(one), multiple=TRUE),
            selectInput("selectTwo", label="Select Two:", choices=names(two), selected = names(two), multiple=TRUE),
            selectInput("selectThree", label="Select Three:", choices=three, multiple=TRUE),
            actionButton("reset",label = "Reset")
        ),
        mainPanel(
            textOutput("listOfThree"),
            textOutput("lastUpdated"),
            textOutput("updated")
        )
    )
)

server = shinyServer(function(input,output,session){

    output$listOfThree = renderText({
        paste("list of three:", paste(input$selectThree, collapse = ", "), sep = " ")
    })
    output$lastUpdated = renderText({
        paste("last update:",rv$lastUpdate, sep = " ")
    })
    rv = reactiveValues(lastUpdate = "four")
    observe({
        oneList = input$selectOne
        rv$lastUpdate = "one"
        twoList = c()
        for (thing in oneList){
            twoList = c(twoList, one[[thing]])
        }
        twoList = sort(twoList)
        updateSelectInput(session, "selectTwo", selected = twoList)

    })
    observe({
        twoList = input$selectTwo
        rv$lastUpdate = "two"
        threeList = c()
        for (thing in twoList){
            threeList = c(threeList, two[[thing]])
        }
        threeList = sort(threeList)
        updateSelectInput(session, "selectThree", selected = threeList)

    })
    observe({
        input$selectThree
        rv$lastUpdate = "three"
    })
    observeEvent(
        input$reset,
        {
            updateSelectInput(session, "selectOne", selected = names(one))
            updateSelectInput(session, "selectTwo", selected = names(two))
            updateSelectInput(session, "selectThree", selected = three)
            rv$updateTwo = FALSE
            rv$updateThree = FALSE
        }
    )
})

shinyApp(ui, server)

样本代码?没有示例代码,几乎不可能理解您的意思。在我看来,您确实在危险地试图以有状态的方式使用一个原则上设计为无状态(由于反应性)的工具。你能更深入地谈谈有状态和无状态以及为什么它是危险的吗?