2 Stimmen

Wie kann man die Eingabe von Zeichen (alphabetisch) in R überprüfen?

Angenommen, ich möchte, dass ein Benutzer meines R-Programms eine positive Zahl eingibt.

Wenn er eine negative Zahl eingibt oder ein beliebiges Alphabet tippt (a, b, c, d, usw.), würde ich ihn so lange versuchen lassen, bis er die gewünschte positive Zahl eingibt.

Wie prüfe ich, ob er ein Zeichen (a, b, c usw.) eingibt?

Zum Beispiel, wenn ich habe: (In der Tat jemand auf dieser Website half mir, diesen Code richtig zu schreiben, aber ich verstehe nicht, bestimmte Dinge vor allem, die dritte Zeile, wie ich angegeben habe "#explanation of this line" im Code

n <- -1
while(is.na(n) | (n < 1)  ){
  n <- readline("enter a positive integer for the number of simulations: ")
  n <- ifelse(grepl("\\D",n),-1,as.integer(n)) #explanation of this line
}

FRAGEN:

  1. Ich weiß, dass is.na(n) bedeutet, wenn n Null ist (nicht verfügbar), wenn der Benutzer also die Eingabetaste drückt is.na(n) wird TRUE . Ist das richtig?

  2. was ist die Bedeutung von: n <- ifelse(grepl("\\D",n),-1,as.integer(n) ?

  3. Wie prüfe ich, ob der Benutzer (a, b, c, d, ...) eingibt?

Danke an alle, die mir helfen können.

Owusu Isaac

5voto

Joris Meys Punkte 102836

Siehe ?regex y ?grep und meine Antwort, von der Sie den Code kopiert haben.

Q1 : Wenn der Benutzer nur die Eingabetaste drückt, wird n "" die, wenn sie in eine ganze Zahl umgewandelt wird, zu NA wird.

> n <- ""
> as.integer(n)
[1] NA

Q2 : grepl ist eine Funktion, die prüft, ob die Werte in einem Vektor einem regulären Ausdruck ( ?regex ) und gibt einen logischen Vektor zurück. In diesem Fall ist der reguläre Ausdruck "\\D" . \D ist alles, was keine Ziffer ist, auch ein negatives Vorzeichen oder ein Punkt. Der Backslash muss escaped werden, deshalb ist er doppelt. Wenn es also auf irgendetwas passt, das keine Ziffer ist, wird n zu -1. Da "" auf nichts passt, würde n zu as.integer(n) und damit zu NA (siehe Q1).

Q3 : Für die Überprüfung von Buchstaben können Sie - wieder - reguläre Ausdrücke verwenden, oder %in% letters :

> n <- "a"
> grepl("[a-z]",n)
[1] TRUE
> n %in% letters
[1] TRUE

Oder, wenn Sie sowohl Klein- als auch Großbuchstaben haben möchten:

> n <- c("a","A")
> grepl("[[:alpha:]]",n)
[1] TRUE TRUE
> grepl("(?i)[a-z]",n)
[1] TRUE TRUE

Dies sind nur einige der Möglichkeiten. Lesen Sie die Hilfedateien, auf die ich verweise, gründlich durch und spielen Sie eine Weile damit herum. Reguläre Ausdrücke sind sehr mächtig, wenn Sie den Dreh erst einmal raus haben.

1voto

IRTFM Punkte 250762

Wenn Sie keine regulären Ausdrücke lernen wollen (aber Sie sollte ), dann würde dieser Code die gleiche Aufgabe erfüllen:

n<--1
while(is.na(n) | (n < 1)  ){
  n <- readline("enter a positive integer for the number of simulations: ")
  if( !is.integer(as.integer(n)) ) {n <- -1} else { 
                                   n <- as.integer(n) }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X