R脚本在本地计算机上成功运行,而不是在EC2实例上运行

时间:2018-09-07 20:23:31

标签: r amazon-ec2 dplyr plumber

我有一个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实例似乎无法处理该函数。

对此我将不胜感激,谢谢!!

2 个答案:

答案 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())) 返回的路径