我的AWS S3存储桶中存储了名为 test_file.txt 的.txt文件 s3://path/to/csv/test_file.txt ,其中包含一个示例语句,如<这是用于测试
我可以使用R中的readLines和pipe语句的组合直接从S3存储桶位置读取此文件
df <- readLines(pipe("aws s3 cp s3://path/to/csv/test_file.txt -"))
df
#[1] "this is for testing"
当我尝试在Rcpp中复制相同内容时,我写了一个文件rcoo_input_string.cpp,如下所示
#include <Rcpp.h>
#include <string.h>
// [[Rcpp::export]]
Rcpp::String rcpp_input_test() {
Rcpp::Environment base = Rcpp::Environment("package:base");
Rcpp::Function readline = base["readline"];
Rcpp::Function as_string = base["as.character"];
std::string input_string = Rcpp::as<std::string> (as_string(readline("> ")));
Rcpp::Rcout << input_string << std::endl;
return input_string;
}
/*** R
library(magrittr)
rcpp_input_test()
*/
注意:我认为std :: cin在R或Rcpp中不起作用,所以我从这篇文章中获取灵感Getting user input from R console: Rcpp and std::cin
我写了另一个文件rcoo_input_string.R,如下所示
library(Rcpp)
sourceCpp("./rcoo_input_string.cpp")
并从AWS CLI执行rcoo_input_string.R文件
aws s3 cp s3://path/to/csv/test_file.txt - | Rscript rcoo_input_string.R
但是我在CLI上获得了以下输出
> library(magrittr)
> rcpp_input_test()
>
[1] ""
这意味着Rcpp函数没有读取 test_file.txt 。
请注意正在运行
sourceCpp("./rcoo_input_string.cpp")
运行得很好,我可以给输入,Rcpp函数也返回字符串值(像这样)
> sourceCpp("./S3_to_R_data_import/rcoo_input_string.cpp")
> library(magrittr)
> rcpp_input_test()
> this is for testing
this is for testing
[1] "this is for testing"
有人可以指导我如何在R中为此功能创建输入流吗? 我说输入流,请纠正我,如果我错了,因为我为C ++文件编写了类似的代码并且执行得很完美。
注意:在尝试解决这个问题时,我也尝试了cppFunction,但这并没有解决问题。 rcoo_input_string_2.R
的示例library(Rcpp)
#sourceCpp("/mnt/legoland/S3_to_R_data_import/rcoo_input_string.cpp")
cppFunction(' String rcpp_input_test() {
Environment base = Environment("package:base");
Function readline = base["readline"];
Function as_string = base["as.character"];
std::string input_string = as<std::string> (as_string(readline("> ")));
Rcout << input_string << std::endl;
return input_string;
}
')
print(rcpp_input_test())