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.