используя цикл while с логическими операторами (И и ИЛИ) - PullRequest
0 голосов
/ 10 мая 2011
n<-NULL
acr<-NULL
while((is.numeric(n)==F) & (acr<0 ¦acr>1)){
   print("enter a  positive integer and the average cancellation rate you want")
   try(n<-scan(what=integer(),nmax=1), silent=TRUE);
   try(acr<-scan(what=double(),nmax=1), silent=TRUE)
}

Я бы хотел, чтобы пользователи моей программы вводили положительное целое число, которое я храню в «n», а второе запись, которую я храню в «acr», является вероятностью, поэтому она лежит между 0 и 1. (Я не хочу, чтобы это было точно 0 или 1, хотя это может быть в соответствии с теорией вероятности). Поэтому я хочу, чтобы пользователь продолжал делать запись, пока он не сможет ввести положительное целое число для «n» и значение вероятности между 0 и 1 для «acr» (используя операторы AND, OR) *

Однако у меня проблема с оператором while / циклом. Я перепробовал все другие возможности, такие как приведенная ниже, но она все еще не работает.

while(is.numeric(n)==F & acr<0 ¦acr>1)

СНОВА: вопрос 2 Я думаю, что есть проблема с what=double() также в функции scan. Я знаю, что, например, 0.5 - это двойной тип данных в других языках программирования, но Я не могу понять это в R (я не знаю, как это называется в R). В чем разница между integer() и double() в R? (Я не знаком с двойным)

Я был бы очень признателен всем, кто мог прийти мне на помощь.

большое спасибо всем.

Исаак Овусу

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Этот следующий пример должен работать. Помните, что is.integer()

"действительно не проверяет, содержит ли" x " целые числа! Для этого используйте «Круглый», как в функции ‘Is.wholenumber (x)’ в примерах » (см. help(is.integer)).

По этой причине я сначала определяю новую функцию is.wholenumber().

is.wholenumber <- function(x, tol = .Machine$double.eps^0.5){
  abs(x - round(x)) < tol
}

n <- NULL
acr <- NULL
stay.in.loop <- TRUE

while(stay.in.loop){
  print("Please insert n and acr!") 
  n <- readline("Insert n: ")
  acr <- readline("Insert acr: ")
  n <- as.numeric(n)    
  acr <- as.numeric(acr)
  ## stay.in.loop is true IF any of the expressions is NOT TRUE 
  stay.in.loop <- !(is.wholenumber(n) & ((0 < acr) & (acr < 1)))
}
0 голосов
/ 10 мая 2011

NULL может быть плохой инициализацией, так как ее сравнение не дает обычного логического значения.Поскольку условие состоит в том, что n должно быть положительным, попробуйте следующее:

n   <- -2
acr <- -2
while((n<=0) | (acr<0) | (acr>1)) {
   print("enter a  positive integer and the average cancellation rate you want")
   try(n<-scan(what=integer(),nmax=1), silent=TRUE);
   try(acr<-scan(what=double(),nmax=1), silent=TRUE);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...