独立反应在 Shiny App 中相互作用
Independent reactions are interacting in a Shiny App
我正在使用带有 animate 参数的 sliderInput
函数在我的 shinyApp 中执行自动计算。但是,使用 animate
会影响我的应用程序中的其他反应。我想停止在其他反应中发生的这种副作用。
例如,我在 if
else
结构中有一个 dropdownMenu
。但是,由于 animate
参数,我无法在启动动画时单击右上角的选项。它随着动画所做的每一次计算而消失。参见:
我尝试在 pred_1()
中使用 isolate()
但它停止了 valueBox
和条件结构(if
else
结构)。
我只想animate
不影响应用程序中的其他反应。
我的应用程序:
library(shiny)
library(shinydashboard)
header <- dashboardHeader(
title = "Dashboard",
titleWidth = 300,
dropdownMenuOutput(
outputId = "drop1"
)
)
sidebar <- dashboardSidebar(
width = 300
)
body <- dashboardBody(
sliderInput(
inputId = "one",
label = "Registro 1",
value = 1,
animate = animationOptions(
interval = 500, loop = TRUE
),
min = 1,
max = 10,
step = 1,
ticks = TRUE
),
sliderInput(
inputId = "two",
label = "Registro 2",
value = 1,
animate = animationOptions(
interval = 500, loop = TRUE
),
min = 1,
max = 10,
step = 1,
ticks = TRUE
),
sliderInput(
inputId = "three",
label = "Sum 3",
value = 1,
animate = animationOptions(
interval = 500, loop = TRUE
),
min = 1,
max = 10,
step = 1,
ticks = TRUE
),
valueBoxOutput(
outputId = "box1"
)
)
ui <- dashboardPage(
header = header,
sidebar = sidebar,
body = body
)
server <- function(session, input, output) {
fx <- function(x, y) {
x + y
}
fy <- function(x) {
x
}
reac_0 <- reactive({
tibble::tibble(
one = input$one,
two = input$two,
three = input$three
)
})
chuveiro <- reactive({
temp <- reac_0()
fx(
x = temp$one,
y = temp$two
)
})
luz <- reactive({
temp <- reac_0()
fy(
x = temp$three
)
})
fdrop <- function(x) {
if (x <= 5) {
dropdownMenu(
type = "notifications",
badgeStatus = NULL,
headerText = "Not 1",
notificationItem(
text = HTML(
"<text style='color:#020202;'>Without.</text>"
),
status = "danger",
icon = icon("times"),
href = NULL
)
)
} else (
dropdownMenu(
type = "notifications",
badgeStatus = "danger",
headerText = "Not 2",
notificationItem(
text = HTML(
"<a style='color:#020202;'
href='https://www.instagram.com' target='_blank' title='A'>
With</a>"
),
status = "success",
icon = icon("tags")
)
)
)
}
output$drop1 <- renderMenu({
expr = fdrop(x = luz())
})
output$box1 <- renderValueBox({
expr = valueBox(
value = chuveiro(),
subtitle = "Sum"
)
})
}
shinyApp(ui, server)
那么我怎样才能在 shinyApp
中使一种反应影响另一种反应?
我想使用 sliderInput
和 animate
正常点击下拉菜单通知。
我尝试隔离 sliderInput
的每个参数,但没有用。
只要输入发生变化,就会触发 reac0()
反应。然后它会触发包含它的每个反应,即使该反应中使用的值没有改变。
您的代码:
reac_0 <- reactive({
tibble::tibble(
one = input$one,
two = input$two,
three = input$three
)
})
luz <- reactive({
temp <- reac_0()
fy(
x = temp$three
)
})
每当 one
、two
或 three
发生变化时触发 luz()
。
另一种方法是直接使用 input$three
:
luz <- reactive({
fy(
x = input$three
)
})
这样,滑块one
和two
的变化或动画不会触发luz()
,也不会触发菜单渲染。
当然,由于滑块three
的值是用来渲染菜单的,任何更新它的值都必须触发菜单渲染。
我正在使用带有 animate 参数的 sliderInput
函数在我的 shinyApp 中执行自动计算。但是,使用 animate
会影响我的应用程序中的其他反应。我想停止在其他反应中发生的这种副作用。
例如,我在 if
else
结构中有一个 dropdownMenu
。但是,由于 animate
参数,我无法在启动动画时单击右上角的选项。它随着动画所做的每一次计算而消失。参见:
我尝试在 pred_1()
中使用 isolate()
但它停止了 valueBox
和条件结构(if
else
结构)。
我只想animate
不影响应用程序中的其他反应。
我的应用程序:
library(shiny)
library(shinydashboard)
header <- dashboardHeader(
title = "Dashboard",
titleWidth = 300,
dropdownMenuOutput(
outputId = "drop1"
)
)
sidebar <- dashboardSidebar(
width = 300
)
body <- dashboardBody(
sliderInput(
inputId = "one",
label = "Registro 1",
value = 1,
animate = animationOptions(
interval = 500, loop = TRUE
),
min = 1,
max = 10,
step = 1,
ticks = TRUE
),
sliderInput(
inputId = "two",
label = "Registro 2",
value = 1,
animate = animationOptions(
interval = 500, loop = TRUE
),
min = 1,
max = 10,
step = 1,
ticks = TRUE
),
sliderInput(
inputId = "three",
label = "Sum 3",
value = 1,
animate = animationOptions(
interval = 500, loop = TRUE
),
min = 1,
max = 10,
step = 1,
ticks = TRUE
),
valueBoxOutput(
outputId = "box1"
)
)
ui <- dashboardPage(
header = header,
sidebar = sidebar,
body = body
)
server <- function(session, input, output) {
fx <- function(x, y) {
x + y
}
fy <- function(x) {
x
}
reac_0 <- reactive({
tibble::tibble(
one = input$one,
two = input$two,
three = input$three
)
})
chuveiro <- reactive({
temp <- reac_0()
fx(
x = temp$one,
y = temp$two
)
})
luz <- reactive({
temp <- reac_0()
fy(
x = temp$three
)
})
fdrop <- function(x) {
if (x <= 5) {
dropdownMenu(
type = "notifications",
badgeStatus = NULL,
headerText = "Not 1",
notificationItem(
text = HTML(
"<text style='color:#020202;'>Without.</text>"
),
status = "danger",
icon = icon("times"),
href = NULL
)
)
} else (
dropdownMenu(
type = "notifications",
badgeStatus = "danger",
headerText = "Not 2",
notificationItem(
text = HTML(
"<a style='color:#020202;'
href='https://www.instagram.com' target='_blank' title='A'>
With</a>"
),
status = "success",
icon = icon("tags")
)
)
)
}
output$drop1 <- renderMenu({
expr = fdrop(x = luz())
})
output$box1 <- renderValueBox({
expr = valueBox(
value = chuveiro(),
subtitle = "Sum"
)
})
}
shinyApp(ui, server)
那么我怎样才能在 shinyApp
中使一种反应影响另一种反应?
我想使用 sliderInput
和 animate
正常点击下拉菜单通知。
我尝试隔离 sliderInput
的每个参数,但没有用。
只要输入发生变化,就会触发 reac0()
反应。然后它会触发包含它的每个反应,即使该反应中使用的值没有改变。
您的代码:
reac_0 <- reactive({
tibble::tibble(
one = input$one,
two = input$two,
three = input$three
)
})
luz <- reactive({
temp <- reac_0()
fy(
x = temp$three
)
})
每当 one
、two
或 three
发生变化时触发 luz()
。
另一种方法是直接使用 input$three
:
luz <- reactive({
fy(
x = input$three
)
})
这样,滑块one
和two
的变化或动画不会触发luz()
,也不会触发菜单渲染。
当然,由于滑块three
的值是用来渲染菜单的,任何更新它的值都必须触发菜单渲染。