我有一个R脚本(一个R plumber API),已将其部署到EC2实例并使用pm2进行管理,但遇到了麻烦的问题。我已查明错误的确切位置,并希望能更好地理解此错误。
当我在本地计算机(Mac上为RStudio)上运行脚本时,它可以正常工作。当我从EC2实例命令行使用Rscript myrfile.R
运行脚本时,脚本中断了。
我已经指出,破坏EC2实例上的脚本的代码行以及它的错误是:
my_df <- my_df %>%
dplyr::mutate(AwayScore = ifelse(dplyr::row_number() == 1, 0, AwayScore),
HomeScore = ifelse(dplyr::row_number() == 1, 0, HomeScore))
# with the following error
<Rcpp::eval_error in mutate_impl(.data, dots): Evaluation error: argument "x" is missing, with no default.>
我100%确信dplyr已安装在EC2实例上,因为我的脚本始终使用它。我还100%确保此处的my_df
数据帧具有AwayScore和homeScore列,并且my_df
也没有任何其他问题。
我只能假设此错误是由于dplyr :: row_number()函数引起的,尽管我对此不太满意,但EC2实例似乎无法处理该函数。
对此我将不胜感激,谢谢!!
答案 0 :(得分:0)
我很容易将代码更改为以下内容:
if(is.na(my_df$AwayScore[1])) { my_df$AwayScore[1] = 0 }
if(is.na(my_df$HomeScore[1])) { my_df$HomeScore[1] = 0 }
...所以我可能不会浪费太多时间来调试它。
答案 1 :(得分:0)
尽管我感谢您通过不使用库来避免了此问题,但有时您可能会发现您想要以类似的方式运行代码,而这需要加载库。
我使用R脚本遇到了类似的问题。我发现找不到我已安装的库。可以使用R.exe代替Rscript.exe,但这会引起其他麻烦。我发现使用Rscript时的环境不包含R_LIBS_USER路径
如果将以下代码附加到R脚本的顶部,则应该可以正常工作
template <class T, class ItrT = typename std::iterator_traits<T>::value_type>
auto foo(T iterator, std::function<void(ItrT)> expr) -> void{
}
template <class T, class ItrT = typename std::iterator_traits<T>::value_type>
auto bar(T iterator, ItrT expr) -> void{
}
int main() {
std::vector<int> vec = {1, 2, 3};
bar(vec.begin(), 1); // Compiles!
foo(vec.begin(), [](int) {}); // Failes!
foo<decltype(vec.begin()),
std::iterator_traits<decltype(vec.begin())>::value_type>
(vec.begin(), [](int) {}); // Compiles!
}
将文件夹路径放入在计算机上找到库的位置。如果在GUI中运行R,这就是p <- "\directory path of local R packages"
.libPaths(c(p,.libPaths()))
返回的路径