Я думаю, что может быть несколько способов настроить это по-разному.
Одна рекомендация, которую я имею, состоит в том, чтобы избегать помещения output
внутрь вашего observers
.
Другой - вызывать функции секундомера только один раз - для обеспечения целостности данных, чтобы убедиться, что ваш дисплей и собранные данные совпадают.
Кроме того, может быть полезно иметь одну таблицу данных хранить все ваши открытые и закрытые события, с дополнительным столбцом для номера животного. Для будущих анализов было бы относительно легко работать с такой таблицей.
Вот краткий пример, который вы можете попробовать, просто чтобы понять поведение. Также добавьте tableOutput('table')
к вашему ui
после вашего conditionalPanel
, чтобы просмотреть фрейм данных.
# ui ----
ui <- fluidPage(
titlePanel("Lymnaea stopwatch"),
sidebarLayout(
sidebarPanel(
selectInput(
"select",
label = "Number of animals",
choices = c(1,2,3,4,5,6,7,8,9,10),
selected = c("1")
)
# action button conditionals ----
),
mainPanel(
h4("Start/Stop Experiment:"),
actionButton('start1',"Start"),
actionButton('stop1', "Stop"),
textOutput('initial1'),
textOutput('start1'),
textOutput('stop1'),
textOutput('stoptime1'),
conditionalPanel(
h4("Animal 1"),
condition = "input.select == '1'||input.select == '2'||input.select == '3'||input.select == '4'||input.select == '5'||input.select == '6'||input.select == '7'||input.select == '8'||input.select == '9'||input.select == '10'",
actionButton('open1', "Open"),
actionButton('close1', "Close"),
textOutput('open1'),
textOutput('opentime1'),
textOutput('close1'),
textOutput('closetime1'),
),
tableOutput('table')
)
)
)
# server ----
server <- function(input, output, session) {
values <- reactiveValues(df = data.frame(Animal = integer(),
Event = character(),
Time = as.POSIXct(character()),
stringsAsFactors = FALSE),
timer = "Timer Off")
output$initial1 <- renderText({
values$timer
})
output$opentime1 <- renderText({
paste("Opened at:", tail(values$df[values$df[["Animal"]] == 1 & values$df[["Event"]] == "Open", "Time"], 1))
})
output$closetime1 <- renderText({
paste("Closed at:", tail(values$df[values$df[["Animal"]] == 1 & values$df[["Event"]] == "Close", "Time"], 1))
})
output$table <- renderTable({
values$df
})
observeEvent(input$start1, {
watch$start()
values$timer <- "Timer Started"
})
observeEvent(input$open1, {
values$df <- rbind(values$df, data.frame(Animal = 1, Event = "Open", Time = watch$open()))
})
observeEvent(input$close1, {
values$df <- rbind(values$df, data.frame(Animal = 1, Event = "Close", Time = watch$close()))
})
}
Это можно увеличить до 10 животных, и есть альтернативные способы предоставления обратной связи пользователю на данных.
Дайте мне знать, что вы думаете, и если это в том направлении, которое вы имели в виду.