Quelle est la bonne façon de demander la saisie de l'utilisateur dans un programme R?
Mon programme ci-dessous(qui est en deux parties) fonctionne si je lance séparément – qui est, si je colle la première partie dans le R de la Console, exécutez-le, puis collez la deuxième et l'exécuter. Cependant, ce n'est pas la façon dont je le veux. Je veux courir à l'ensemble du programme à la fois. Si je fais qu'il affiche l'erreur suivante dans ma console :
1:
Read 0 items
1:
Read 0 items
Error in while ((n <= 0) | (acr <= 0) | (acr >= 1)) { :
argument is of length zero
J'ai essayé d'identifier le problème, mais je n'ai pas pu trouver la cause. Je serais plus qu'heureux, si quelqu'un pouvait venir à mon secours.
#**FIRST PART OF THE PROGRAM**
n <- -2
acr <- -2
while((n<=0) | (acr<=0) | (acr>=1)) {
print("enter a positive integer and the average cancellation rate between 0 and 1
you want")
try(n <- scan(what=integer(), nmax=1), silent=TRUE)
try(acr <- scan(what=double(), nmax=1), silent=TRUE)
}
#**SECOND PART OF THE PROGRAM**
bygrace <- read.table("C:\\MyRfolder\\bygrace.txt", header=FALSE)
r <- nrow(bygrace)
c <- ncol(bygrace)
copybygrace <- array(bygrace, dim=c(r, c))
copybygrace <- bygrace[-((n+1):r), ]
write.table(copybygrace,file="C:\\MyRfolder\\copybygrace.txt", sep="\t")
copybygrace <- read.table("C:\\MyRfolder\\copybygrace.txt", header=TRUE)
- J'ai édité votre question afin de clarifier le problème. S'il vous plaît, essayez de donner des renseignements complets dans votre question sur les erreurs que vous voyez. Ainsi, vous obtenez une réponse plus rapide.
Vous devez vous connecter pour publier un commentaire.
@Marek est très à droite. Quelques remarques :
scan()
maisreadline()
pour cela.grepl()
pour vérifier si l'entrée est le bon format.Inclure le bon de contrôles et de rattraper toutes les erreurs possibles, à la suite de construire est beaucoup plus propre et ne cassera pas votre code lors de la copie de la console :
Cela montre la façon de mettre fin à la question quand les gens ne remplissez pas quoi que ce soit. Le grepl construire exludes n'importe quel caractère qui n'est pas un chiffre, y compris le point.
Cela montre comment re-poser la question quand les gens ne remplissez pas quoi que ce soit. Le grepl exclut tout caractère qui n'est pas un chiffre ou un point.
readlines()
au lieu descan
était déjà offered pour @Fils. @Joris Meys +1 pour la mention degrepl()
.readline()
😉C'est parce que lorsque vous copiez et collez ensuite
scan
lit collé les lignes en entrée.Si vous copiez ce lignes de l'arborescence de la console
x
devenir1
,scan
n'attendez pas que votre interaction cause, il a de ligne à lire.Vous avez à tout envelopper dans
{}
:Vous avez de l'envelopper les deux parties de votre programme. Pour être plus clair: lorsque vous collez votre code dans la console
}
devrait être le dernier signe.