Запуск программы на основе ответа окна сообщения в R

#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)) (но имена этих переменных не звучат так, как будто они относятся к числовым столбцам, поэтому, возможно, не имеет смысла проверять их на наличие отрицательных значений … ?)