Rのパッケージダウンロードでプロキシの設定にはまったので覚書。
対象環境
- R-3.5.1 for Windows 64 bit
- RStudio 1.1.463 - Windows 64bit
- Windows Server 2008 64bit
- インターネット接続にはプロキシ認証が必要
現象
install.packages("pkgname")
を実行すると、407 Proxy Authentication Requiredが返る(RStudioの画面は"Cannot open ")。
対処法
まずはRStudioで(Rコンソールでもrguiでも可)を以下を試して接続可能か確認する。
proxy_url = "http://user:pass@proxyhost:proxyport"
Sys.setenv("http_proxy" = proxy_url)
Sys.setenv("https_proxy" = proxy_url)
curlGetHeaders("http://www.google.com/") # URLはなんでもいいのでこれで200が返るか試す
これで通るなら以下のようにすればパッケージダウンロードができるようになる。
options(download.file.method = "libcurl")
install.packages("pkgname")
毎回やるのが面倒なら、以下のようにプロファイルと環境変数ファイルを作成する。
file.edit('~/.Rprofile')
file.edit('~/.Renviron')
options(download.file.method = "libcurl")
http_proxy="http://user:pass@proxyhost:proxyport"
https_proxy="http://user:pass@proxyhost:proxyport"
確認できたこと
パッケージのダウンロードには、download.file()
関数を使用しているらしい。そして少なくともWindows版ではデフォルトのhttp通信method(HTTPリクエストメソッドのことではなく使用するAPI)が"wininet"で、Windows OSのWinInet関数を使用する。そしてこの関数とプロキシサーバの相性が悪いときにこれにハマる。おそらくdownload.file()
はプロキシの認証情報もOS(資格情報)から取得しているので、グループポリシーで認証情報を保存できない(つまりIEを起動するたびに認証情報を入力しなければならないようになっている)場合、認証情報なしでプロキシにリクエストを投げて407が返る。環境変数から認証情報を取得してくれればよいものを、どうやらそういう実装にはなっていない。
methodを"WinInet"以外にすれば、そのAPIを使用した実装次第で環境変数から認証情報を取ってきてくれるということっぽい。
というわけで今回は、download.file()
関数のmethodを"libcurl"にしたらプロキシ認証できた。今の所は残念ながらRStudioでは動的にプロキシ認証情報を渡せないらしいので、ファイルに書いておくしかない。