#r #shiny
#r #блестящий
Вопрос:
Я создал программу, которая проверяет наличие отрицательных значений в данных, а затем выдает сообщение о том, что данные содержат отрицательные значения «вы хотите продолжить или нет?» На основе ответа окна сообщения программа должна выполняться дальше. Я хочу остановить программу, если пользователь нажмет «Нет» и захочет продолжить при нажатии «Да«.
Как это сделать?
Пример кода:
a <- any(data$time < 0)
if (a == FALSE)
{
require(tcltk)
msgBox <- tkmessageBox(title = "Negative Values",
message = "Data have negative values,do you want to proceed further n Press YES to proceed according to the program and press NO to stop" , icon = "info", type = "yesno")
}
Ответ №1:
А как насчет readline
вместо всплывающего окна?
f <- function(x) {
ok <- if (any(x < 0))
readline('x contains negative values, continue? ') else 'yes'
if (tolower(substring(ok, 1, 1)) != 'y')
return(x)
min(x)
}
f(1:5)
# [1] 1
f(-1:5)
# x contains negative values, continue? YES PLS
# [1] -1
f(-1:5)
# x contains negative values, continue? NO THNK U
# [1] -1 0 1 2 3 4 5
Вы также можете использовать utils::menu
для аналогичной функции
f <- function(x) {
ok <- if (any(x < 0))
menu(c('Yes','No'), FALSE, 'x contains negative values, continue?') else 1
if (ok == 2)
return(x)
min(x)
}
f(1:5)
# [1] 1
f(-1:5)
# x contains negative values, continue?
#
# 1: Yes
# 2: No
#
# Selection: 1
# [1] -1
f(-1:5)
# x contains negative values, continue?
#
# 1: Yes
# 2: No
#
# Selection: 2
# [1] -1 0 1 2 3 4 5
Ответ №2:
msgBox
может быть преобразован в символ, затем вы можете работать с результатом, как указано ниже. Не стесняйтесь вставлять любой код вместо print()
.
https://stat.ethz.ch/R-manual/R-devel/library/base/html/stop.html
require(tcltk)
data <- data.frame (
"time" = c(1,2,3)
)
a <- any(data$time < 0)
if (a == FALSE)
{
msgBox <- tkmessageBox(title = "Negative Values",
message = "Data have negative values,do you want to proceed further n Press YES to proceed according to the program and press NO to stop" , icon = "info", type = "yesno")
msgBoxCharacter <- as.character(msgBox)
if(msgBoxCharacter == "yes"){
print("flow continues! enter commands here!")
} else {
print("flow stops! enter commands here!")
# for example
stop("the user pressed no!")
}
}
Это еще проще:
msgBoxCharacter <- as.character(msgBox)
if(msgBoxCharacter == "no"){
print("flow stops! enter commands here!")
# for example
stop("the user pressed no!")
}
print("flow continues! enter commands here!")
Комментарии:
1. что делать, если я хочу одновременно проверять значения меньше нуля для других двух столбцов .. например, для имени столбца, зоны , города
2. вам следует прочитать еще несколько базовых материалов на языке R, но:
with(data,any(name<0) || any(zone<0) || any(city<0))
(но имена этих переменных не звучат так, как будто они относятся к числовым столбцам, поэтому, возможно, не имеет смысла проверять их на наличие отрицательных значений … ?)