Obtenir les entrées de l’utilisateur depuis la console R: Rcpp et std :: cin

J’ai fait quelques exercices pour apprendre le c ++ et j’ai décidé de les intégrer à R, car je souhaite écrire des programmes c ++ pour les fonctions R. Je ne parviens pas à trouver une solution pour récupérer les entrées de l’utilisateur à partir de la console R. Bien qu’il y ait Rcpp :: Rcout pour imprimer et renvoyer une sortie, il ne semble pas exister de fonction similaire pour std :: cin ….

#include  // [[Rcpp::export]] Rcpp::Ssortingng cola() { Rcpp::Rcout << "Pick a drink:" << std::endl << "1 - Espresso" << std::endl << "2 - Americano" << std::endl << "3 - Latte" << std::endl << "4 - Cafe dopio" << std::endl << "5 - Tea" <> drink; std::ssortingng out; switch(drink) { case 1: out = "Here is your Espresso"; case 2: out = "Here is your Americano"; case 3: out = "Here is your Latte"; case 4: out = "Here is your Cafe dopio"; case 5: out = "Here is your Tea"; case 0: out = "Error. Choice was not valid, here is your money back."; break; default: if(drink > 5) {out = "Error. Choice was not valid, here is your money back.";} } return out; } 

Même sans Rcpp dans le mélange, std::cin n’est pas adapté à la saisie interactive.

Pour utiliser la console R avec Rcpp, vous devez utiliser les fonctions R (en particulier readline ) au lieu des fonctionnalités C ++. Heureusement, vous pouvez extraire des objects R dans votre code C ++:

 Environment base = Environment("package:base"); Function readline = base["readline"]; Function as_numeric = base["as.numeric"]; 

Et puis vous pouvez les utiliser:

 int drink = as(as_numeric(readline("> "))); 

Attention, il y a une autre erreur dans votre code: vos cas sont voués à l’ break puisque vous manquez la break ; de plus, il n’y a aucune raison d’avoir un case 0 , et il n’y a aucune raison du if dans le cas par défaut.

Oh, et finalement, n’utilisez pas std::endl sauf si vous avez réellement besoin de vider la sortie (et vous ne devez le faire qu’une fois ici, à la fin); utilisez '\n' place.