2016-09-01 6 views
2

パッケージ化されたRバイナリとライブラリ(インストールなし)を使用して、AWS EC2インスタンスのコマンドラインでRスクリプトを実行しようとしています。 AWS Lambdaへの展開私はthese instructionsに続いた。この手順は、すべてのRバイナリとライブラリをzipファイルにパッケージ化し、テストのためにすべてをAmazon EC2インスタンスに移動するためのものです。私は、新しいマシン上のすべてを解凍したマシン上で「sudoのyumのアップデート」を実行し、適切な場所を指すようにRの環境変数を設定します。RscriptがAWSラムダのパッケージ化されたRで動作しない

export R_HOME=$HOME 
export LD_LIBRARY_PATH=$HOME/lib 

注:は$ HOMEは/ home/EC2ユーザーに等しいです。

私はテストにこのhello_world.Rファイル作成:

#!/home/ec2-user/bin/Rscript 
print ("Hello World!") 

をしかし、私はこの実行したとき:だから私がチェック

Rscript execution error: No such file or directory 

ec2-user$ Rscript hello_world.R 

を、私は、次のエラーを得ましたパスは、すべてがチェックアウト:

ec2-user$ whereis Rscript 
    Rscript: /home/ec2-user/bin/Rscript 

ec2-user$ whereis R 
    R: /home/ec2-user/bin/R /home/ec2-user/R 

しかし、私は、コマンドラインでRscriptを使用して式を評価しようとしたとき、私はこれが得た:

ec2-user$ Rscript -e "" --verbose 
    running 
    '/usr/lib64/R/bin/R --slave --no-restore -e ' 

    Rscript execution error: No such file or directory 

Rscriptはまだデフォルトの場所「は/ usr/lib64に/ RでRを探しているようです/ binに/ R /ホーム/ EC2ユーザー 『」私のR_HOME変数に設定されていても』:

ec2-user$ echo $R_HOME 
    /home/ec2-user 

私はサポートの振りかけるを見つけたが、私は私の特定の問題を解決する何かを見つけることができません。 Rを再インストールすることを提案している人もいますが、ラムダの目的のためにすべてを自己完結型にする必要があるため、別のEC2インスタンスにRをインストールしてパッケージ化しました。 Rがパッケージマネージャーと共にインストールされたマシンでは、すべてがうまく動作することに言及する必要があります。

解決策:回答に私のsolutionを掲載しました。

答えて

2

は、すぐそこにあなたを見つめているthinkt:あなたはRを置く場所

ec2-user$ whereis R 
    R: /home/ec2-user/bin/R /home/ec2-user/R 

がある - しかし、それがために建てられた/期待し、この:

ec2-user$ Rscript -e "" --verbose 
    running 
    '/usr/lib64/R/bin/R --slave --no-restore -e ' 

これらのパスは同じではありません。実際のエラーは、 Rのインストールを別のディレクトリに再構成しただけである可能性があります。できません。

新しい(既知の)パスのRを構築してインストールすることができます。以下のために構成され、インストール-でパスが同じで、すべてが良い、システム上:

$ Rscript -e "q()" --verbose 
running 
    '/usr/lib/R/bin/R --slave --no-restore -e q()' 

$ 
+0

ありがとうございました。ええ、これは問題の根本だと感じましたが、問題を解決する方法がわかりませんでした。私はこの解決策の一部に続きました。http://fumodibit.blogspot.co.uk/2013/04/modifying-r-to-obtain-relocatable.html?showComment=1436450064627 –

2

This blogポストは、同様の問題をウォークスルーし、潜在的なソリューションを提供しています。私はまた、this postからソリューションの一部を実装しなければなりませんでした。これに

​​

R_HOME_DIR=${RHOME}/lib64${R_ROOT_DIR} 

私は理由を下記に説明します

私はこのからRのソースコードの非常に最初の行を変更しました。

NOTE - コードの残りの部分は次のとおりです。

if test "${R_HOME_DIR}" = "${R_ROOT_DIR}/lib64${R_ROOT_DIR}"; then 
    case "linux-gnu" in 
    linux*) 
    run_arch=`uname -m` 
    case "$run_arch" in 
     x86_64|mips64|ppc64|powerpc64|sparc64|s390x) 
      libnn=lib64 
      libnn_fallback=lib 
     ;; 
     *) 
      libnn=lib 
      libnn_fallback=lib64 
     ;; 
    esac 
    if [ -x "${R_ROOT_DIR}/${libnn}${R_ROOT_DIR}/bin/exec${R_ROOT_DIR}" ]; then 
     R_HOME_DIR="${R_ROOT_DIR}/${libnn}${R_ROOT_DIR}" 
    elif [ -x "${R_ROOT_DIR}/${libnn_fallback}${R_ROOT_DIR}/bin/exec${R_ROOT_DIR}" ]; then 
     R_HOME_DIR="${R_ROOT_DIR}/${libnn_fallback}${R_ROOT_DIR}" 
    ## else -- leave alone (might be a sub-arch) 
    fi 
    ;; 
    esac 
fi 

if test -n "${R_HOME}" && \ 
    test "${R_HOME}" != "${R_HOME_DIR}"; then 
    echo "WARNING: ignoring environment value of R_HOME" 
fi 
R_HOME="${R_HOME_DIR}" 
export R_HOME 

あなたは一番下に見ることができ、コードセットは、それが元々R_ROOT_DIRに基づいて割り当てられR_HOME_DIR、に等しいR_HOME。

R_HOME_DIRまたはR_HOME変数を何に設定しても、RはR_ROOT_DIR変数を使用してすべてをリセットします。変更に伴い

、私はすべての環境変数を設定することができます。

export RHOME=$PWD/R #/home/ec2-user/R 
export R_HOME=$PWD/R #/home/ec2-user/R 
export R_ROOT_DIR=/R #/R 

私はRパッケージが座っている私の作業ディレクトリにRHOMEを設定します。 RHOMEは基本的に接頭辞として動作しますが、私の場合は/ home/ec2-user /です。

また、Rscriptは、コマンドラインで... RHOMEが何であれに/ R/binに、今、私は適切に実行することができます...

Rscript hello_world.R 

を追加します。 Rscriptはどこにあるのかを知っているRを見つける場所を知っています。

Dockerなどを使用せずに、Rを携帯用の内蔵型のフォルダで実行するようにRをパッケージ化したいと思っているので、誰かがこれを行うより良い方法を持っている場合は、本当に感謝します。

関連する問題