2016-04-12 4 views
3

Je développe un script R dans RStudio qui nécessite que l'utilisateur saisisse deux valeurs (un prénom et un nom de famille). Ces entrées seront ensuite utilisées pour la correspondance de modèle d'un document texte. En Python, raw_input serait utilisé pour rassembler ces valeurs et je comprends que readline (prompt =) est la fonction associée dans R, mais je ne peux pas avoir l'impression que mon script s'arrête pour demander une valeur. Au lieu de cela, il ajoute la ligne de code suivante.Execute R Script qui demande et incorpore les invites utilisateur

Ma fonction pour inviter l'utilisateur pour les noms est:

askForName <- function(firstOrLast){ 
    if(firstOrLast == "first"){ 
    x <- readline(prompt = "Enter first name: ") 
    } 
    else if(firstOrLast == "last"){ 
    x <- readline(prompt = "Enter last name: ") 
    } 
    return(x) 
} 

Quand je lance:

firstName <- askForName("first") 
lastName <- askForName("last") 

Les rendements de la console:

> firstName <- askForName("first") 
Enter first name: lastName <- askForName("last") 

Comment puis-je obtenir R attendre pour une valeur entrée par l'utilisateur avant de passer à travers le script?

+0

Ce n'est pas comment vous faites cela. Quoi qu'il en soit, la documentation indique clairement que "[readline] ne peut être utilisé que dans une session interactive". – Roland

+0

Soit laisser votre utilisateur entrer les paramètres en tant que paramètres de fonction ou aller tout le chemin et utiliser quelque chose comme brillant. – Roland

Répondre

1

Si vous exécutez un script contenant ces appels de fonction, cela fonctionnera correctement. Le problème dans ce cas est que vous collez une ligne après l'appel "readline". Je viens de tester cela et ça marche bien, comme dans le code de production utilisé par l'entreprise pour laquelle je travaille.

test.r:

askForName <- function(firstOrLast){ 
    if(firstOrLast == "first"){ 
    x <- readline(prompt = "Enter first name: ") 
    } 
    else if(firstOrLast == "last"){ 
    x <- readline(prompt = "Enter last name: ") 
    } 
    return(x) 
} 

firstName <- askForName("first") 
lastName <- askForName("last") 

Puis:

source("test.R") 
Enter first name: Alan 
Enter last name: O'Callaghan 
0

Essayez ceci au lieu de readline:

cat("a string please: ") 
a <- readLines("stdin",n=1); 
cat(a, "\n") 
0

Vous pouvez créer un pour lire une ligne d'entrée typeLine fonction() puis utilisez le résultat pour vos prochaines commandes. Il attendra votre texte d'entrée soit vous exécutez votre code rstudio ou dans le terminal:

typeline <- function(msg="Enter text: ") { 
    if (interactive()) { 
    txt <- readline(msg) 
    } else { 
    cat(msg); 
    txt <- readLines("stdin",n=1); 
    } 
    return(txt) 
} 

firstname=typeline("firstName: ") 
secondname=typeline("secondName: ") 

print(firstname) 
print(secondname)