Cách không đau để cài đặt phiên bản mới của R?


158

Andrew Gelman gần đây than thở về việc thiếu một quy trình nâng cấp dễ dàng cho R (có lẽ phù hợp hơn trên Windows so với Linux). Có ai có một mẹo hay để thực hiện nâng cấp, từ cài đặt phần mềm đến sao chép tất cả các cài đặt / gói không?

Đề xuất này được chứa trong các bình luận và là những gì tôi đã sử dụng gần đây. Đầu tiên bạn cài đặt phiên bản mới, sau đó chạy phiên bản cũ này:

#--run in the old version of R
setwd("C:/Temp/")
packages <- installed.packages()[,"Package"]
save(packages, file="Rpackages")

Tiếp theo là trong phiên bản mới:

#--run in the new version
setwd("C:/Temp/")
load("Rpackages")
for (p in setdiff(packages, installed.packages()[,"Package"]))
install.packages(p)

1
Làm thế nào cập nhật là giải pháp đã được sử dụng ở đây?
maj

Tôi đã sử dụng nó gần đây và làm việc tuyệt vời.
Litwos

Câu trả lời:


74

Chỉ để hoàn thiện, có một số cách để ngăn bạn gặp vấn đề này. Như Dirk đã nói, hãy lưu các gói của bạn vào một thư mục khác trên máy tính của bạn.

install.packages("thepackage",lib="/path/to/directory/with/libraries")

Bạn có thể thay đổi mặc định .Librarygiá trị sử dụng chức năng .libPathsquá

.libPaths("/path/to/directory/with/libraries")

Điều này sẽ đặt đường dẫn này làm giá trị đầu tiên trong .Librarybiến và sẽ biến nó thành mặc định.

Nếu bạn muốn tự động hóa điều này hơn nữa, bạn có thể chỉ định điều này trong tệp Rprofile.site, mà bạn tìm thấy trong thư mục / etc / của bản dựng R của bạn. Sau đó, nó sẽ tự động tải mỗi lần R tải, và bạn không phải lo lắng về điều đó nữa. Bạn chỉ có thể cài đặt và tải các gói từ thư mục được chỉ định.

Cuối cùng, tôi có một số mã nhỏ được bao gồm trong Rprofile.site cho phép tôi cài đặt lại tất cả các gói khi tôi cài đặt phiên bản R mới. Bạn chỉ cần liệt kê chúng trước khi cập nhật lên phiên bản R mới. Tôi làm điều đó bằng cách sử dụng tệp .RData chứa danh sách được cập nhật với tất cả các gói.

library(utils)

## Check necessary packages
load("G:\Setinfo\R\packagelist.RData") # includes a vector "pkgs"
installed <- pkgs %in% installed.packages()[, 'Package']
if (length(pkgs[!installed]) >=1){
  install.packages(pkgs[!installed])
}

Tôi tạo packagelist.RData bằng cách chỉ định .Last()trong Rprofile.site của tôi. Điều này cập nhật danh sách gói nếu tôi cài đặt một số:

.Last <- function(){
  pkgs <- installed.packages()[,1]
  if (length(pkgs) > length(installed)){
    save(pkgs,file="G:\Setinfo\R\packagelist.RData")
  }
}

Khi tôi cài đặt phiên bản R mới, tôi chỉ cần thêm các yếu tố cần thiết vào tệp Rprofile.site và tất cả các gói được cài đặt lại. Tôi phải điều chỉnh Rprofile.site bằng mọi cách (sử dụng độ tương phản tổng, thêm mã bổ sung cho Tinn-R, những thứ này), vì vậy nó không thực sự là công việc phụ. Nó chỉ mất thêm thời gian để cài đặt tất cả các gói một lần nữa.

Bit cuối cùng này tương đương với những gì được đưa ra trong câu hỏi ban đầu như là một giải pháp. Tôi không cần phải lo lắng về việc nhận danh sách "đã cài đặt" trước.

Một lần nữa, điều này không hoạt động hoàn hảo nếu bạn có các gói không được cài đặt từ CRAN. Nhưng mã này có thể dễ dàng mở rộng để bao gồm cả những người quá.


2
@Prasad: Thx. Câu trả lời là hơi lỗi thời, R 2.12 và tự động lưu các gói bạn tự cài đặt ở đâu đó trong thư viện chuẩn bên ngoài cây R chính. Vì vậy, tất cả những gì bạn phải làm bây giờ là đảm bảo rằng bạn tìm thấy thư viện đó và liên kết với nó, nếu điều đó không tự xảy ra.
Joris Meys

@ 428790: Tôi có thể tìm thấy thư viện mà bạn đề cập ở đâu?
Daniel Krizian

@DanielKrizian Nhìn vào mặc định trong đối tượng nội bộ .Library. Trong trường hợp của tôi, nó quay lại thư mục cài đặt R nếu không thay đổi (điều mà tôi đặc biệt không thích, nhưng cũng tốt)
Joris Meys

42

Đây là một câu hỏi cũ tất nhiên nhưng có thể có một câu trả lời dễ dàng mới (chỉ hoạt động cho Windows), mà tôi vừa tìm thấy.

install.packages("installr")
require(installr)
updateR()

Cách tốt nhất để làm điều này là từ hệ thống RGui. Tất cả các gói của bạn sẽ được chuyển sang thư mục mới và những gói cũ sẽ bị xóa hoặc lưu (bạn có thể chọn một trong hai). Sau đó, khi bạn mở lại RStudio, nó sẽ nhận ra ngay rằng bạn đang sử dụng một phiên bản cập nhật. Đối với tôi điều này làm việc như một cơ duyên,

Thêm thông tin về {installr} tại đây .

Simon


2
Còn các gói được cài đặt qua github thì sao?
skan

8
Cần phải đề cập rằng điều này là dành cho Windows.
beroe

27

Hai gợi ý nhanh:

  1. Sử dụng Gabor batchfiles mà được cho là công cụ bao gồm việc giúp đỡ với ví dụ như thư viện với số lượng lớn di dời. Hãy cẩn thận: Tôi đã không sử dụng chúng.

  2. Không cài đặt các thư viện trong 'filetree' của phiên bản R đã cài đặt. Trên Windows, tôi có thể đặt R vào phiên bản C: / opt / R / R- $ nhưng đặt tất cả các thư viện vào C: / opt / R / library / sử dụng đoạn mã sau vì nó làm giảm bớt vấn đề ở vị trí đầu tiên:

$ cat .Renviron         # this is using MSys/MinGW which looks like Cygwin  
## Example .Renviron on Windows    
R_LIBS="C:/opt/R/library"

Tôi tự hỏi nếu chuyển gói từ R 2.8 sang R.9 có gây ra vấn đề gì không? Hoặc mọi thứ sẽ ổn miễn là bạn thực hiện update.packages trong phiên bản mới?
Eduardo Leoni

Tôi đã làm điều này khá lâu và không gặp vấn đề gì. R thường là "tương thích về phía trước". Và IIRC chỉ có một bản nâng cấp (có thể là R 1.9 -> R 2.0) yêu cầu xây dựng lại tất cả các thư viện.
Dirk Eddelbuettel

5
Tôi cũng thường chỉ sao chép thư mục Thư viện vào bản cài đặt mới và chạy update.packages. Nó dường như làm việc ổn. Một thư mục cài đặt tùy chọn tuy nhiên thanh lịch hơn nhiều.
kpierce8

Chỉ cần chỉ ra - Tôi đã thêm một câu trả lời với mã R thực hiện đề xuất của Dirk (cho người dùng windows R)
Tal Galili

25

Phương pháp được đề xuất ở trên sẽ không hoàn toàn hoạt động nếu bạn có các gói không phải từ CRAN. Ví dụ: gói cá nhân hoặc gói được tải xuống từ trang không phải CRAN.

Phương pháp ưa thích của tôi trên Windows (nâng cấp 2.10.1 lên 2.11.0):

  1. Cài đặt R-2.11.0
  2. Sao chép R-2.10.0/library/*vàoR-2.11.0/library/
  3. Trả lời "không" cho các lời nhắc hỏi bạn có được ghi đè không.
  4. Bắt đầu R 2.11.0
  5. Chạy lệnh R update.packages()

7

Đối với giải pháp được đưa ra trong câu hỏi, có thể không dễ để chạy phiên bản R cũ hơn của bạn nếu bạn đã cài đặt phiên bản mới. Trong trường hợp này, bạn vẫn có thể cài đặt lại tất cả các gói bị thiếu từ phiên bản R trước đó như sau.

# Get names of packages in previous R version
old.packages <- list.files("/Library/Frameworks/R.framework/Versions/3.2/Resources/library")

# Install packages in the previous version. 

# For each package p in previous version...
    for (p in old.packages) {
      # ... Only if p is not already installed
      if (!(p %in% installed.packages()[,"Package"])) {
        # Install p 
        install.packages(p) 
      }
    }

(Lưu ý rằng đối số list.files()trong dòng mã đầu tiên phải là đường dẫn đến thư mục thư viện cho phiên bản R trước của bạn, trong đó tất cả các thư mục của gói trong phiên bản trước. Trong trường hợp hiện tại của tôi, điều "/Library/Frameworks/R.framework/Versions/3.2/Resources/library"này sẽ khác nếu phiên bản R trước đây của bạn không phải là 3.2 hoặc nếu bạn đang dùng Windows.)

Các iftuyên bố đảm bảo rằng một gói phần mềm được không cài đặt nếu

  • Nó đã được cài đặt trong phiên bản R mới, hoặc
  • Đã được cài đặt như một phần phụ thuộc từ gói được cài đặt trong lần lặp trước của forvòng lặp.

Điều này đã giải quyết vấn đề của tôi, cảm ơn! Câu hỏi này nghe có vẻ hơi ngu ngốc, nhưng tôi có thể xóa các thư viện cũ không?
m_c

4

Theo đề xuất của Dirk, đây là một số mã R để thực hiện trên windows: Cách dễ dàng nâng cấp R trên windows XP

Cập nhật (15.04.11): Tôi đã viết một bài đăng khác về chủ đề này, giải thích cách xử lý các vấn đề phổ biến về nâng cấp R trên windows 7


2
Đối với các phiên bản R mới nhất, Tal có một gói được gọi là installrtự động hóa quá trình này (hiện chỉ có trên Windows) r-statistic.com/tag/installr hoặc github.com/talgalili/installr
Louis Maddox

1
Chạy Rgui.exe từ C: \ Program Files \ R \ R-3.6.0 \ bin \ i386 và viết mã vào bàn điều khiển : install.packages(installr); library(installr); updateR(TRUE). Cuối cùng, [1] TRUExuất hiện. Theo gói tuyệt vời của Galili, tôi đã chuyển từ R 3.6.0 sang R 3.6.1 rất dễ dàng. Cảm ơn Tal.
Erdogan CEVHER

2

Hai lựa chọn:

  1. Thực hiện câu trả lời của tôi ở đây
  2. Nếu bạn sử dụng R trong Eclipse với StatET, hãy mở Run Configurations , nhấp vào tab Console và trong hộp có tên R snippet chạy sau khi khởi động thêm dòng này với lựa chọn thư mục của bạn:.libPaths("C:/R/library")

1

Tôi đang dùng Windows 8 và vì một số lý do kỳ lạ, tôi không bao giờ có thể cài đặt các gói bằng kết nối internet của mình.

Tôi thường cài đặt nó bằng tệp .zip từ CRAN.

Sau khi tôi đi từ R 3.2.5 đến R 3.3.1.

Tôi chỉ đơn giản là sao chép các gói từ

C:\Path\to\packa\R\win-library\3.2để C:\Path\to\packa\R\win-library\3.3.

Và sau đó tôi khởi động lại phiên R. Làm việc hoàn hảo. Tôi đã không kiểm tra nếu TẤT CẢ các gói đang hoạt động tốt. Nhưng, những cái tôi đã kiểm tra đang hoạt động hoàn hảo. Hy vọng hack này hoạt động cho tất cả mọi người.

Chúc mừng.


1

Câu trả lời được chấp nhận có thể hoạt động nếu bạn có tầm nhìn xa, nhưng tôi đã thoát khỏi phiên bản cũ nên không thể làm theo các hướng dẫn này. Các bước được mô tả dưới đây hoạt động để nâng cấp OSX từ 2.1 và 3.1.

CẬP NHẬT: Để có được thư mục cho phiên bản mới nhất của bạn (thay vì nhập vào 3.1 hoặc 3.2), bạn có thể sử dụng các lệnh bên dưới. Thứ hai là một người cải đạo trực tiếp đến R-biến, bỏ qua ....DS_Store, sử dụng:

OLD=$(ls -d /Library/Frameworks/R.framework/Versions/*.* |tail -n 2 | head -n 1)Resources/library/
echo "packages = c(\"`ls $OLD | tail +4| paste -s -d ',' - | sed -E 's|,|\",\"|'g`\")" | tr -d "/" 

(Thêm |pbcopyvào cuối để sao chép trực tiếp vào bảng tạm của máy Mac)

Sau đó, trong R bạn có thể dán biến đó được tạo. Khi đã được xác định trong phiên bản R mới, bạn có thể lặp qua các gói đã cài đặt từ các hướng dẫn ở trên ...

for (p in setdiff(packages, installed.packages()[,"Package"]))
   install.packages(p, dependencies=TRUE, quiet=TRUE, ask=FALSE)

0

đối với tôi trang này tốt https://www.r-statistic.com/2013/03/updating-r-from-r-on-windows-USE-the-installr-package/ hoặc một tùy chọn khác chỉ là cài đặt mới tùy chọn và cuối cùng bạn đặt, ví dụ như trong windows trong máy tính của tôi

.libPaths (c ("D: /Document/R/win-l Library / 3.2", "C: / Tệp chương trình / R / R-3.2.3 / thư viện", "C: / Tệp chương trình / R / R-3.2 .0 / thư viện "," D: /Document/R/win-l Library / 2.15 ")

mọi đường dẫn của phiên bản cuối cùng trong trường hợp của tôi, tôi luôn đặt đường dẫn đầu tiên là "D: /Document/R/win-l Library / 3.2" đã được sửa và sau đó tôi đặt đường dẫn khác vì bạn không cần sao chép hoặc di chuyển bất kỳ gói nào, trong sugest của tôi chỉ cần gọi nó


0

linux+ bash+ debian+ aptNgười sử dụng:

  1. Nếu bạn đang cài đặt / nâng cấp lên phiên bản mới nhất R, thì chúng tôi có thể cho rằng bạn có rootquyền. (Không cần thiết, chỉ làm cho quá trình đơn giản hơn rất nhiều; để thống nhất tập lệnh bên dưới sử dụng sudocho tất cả các cài đặt.) Vì các Rgói cũng được cài đặt bởi root, nên cho phép đặt chúng vào /usr/local/.

  2. Cuộc gọi đến curlbên dưới giả định rằng bạn đã quan tâm đến việc sidphát hành phiên bản không ổn địnhR mới nhất (theo yêu cầu khi xây dựng / kiểm tra gói) tức làR

    cat /etc/apt/sources.list | grep 'sid' || exit 1

    mặc dù điều này có thể dễ dàng được thay thế bằng một bản phát hành ổn định gần đây, vd buster.

  3. Lưu ý rằng tôi không sử dụng khóa như thường được khuyến nghị . Điều này không cần thiết, đặc biệt nếu (như trong đoạn script sau) chúng ta cài đặt các gói trong R chính nó ( Rscript -ebên dưới). Ngoài ra, các khóa như vậy có xu hướng phá vỡ / thay đổi cứ sau vài năm. Vì vậy, tất nhiên, bạn được hoan nghênh thêm lời nói đầu vào tệp R.shsau:

    sudo apt-key adv --keyserver keyserver.ubuntu.com \ --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

  4. Các arraycủa Rgói rõ ràng là không đầy đủ nhưng đưa ra một số ví dụ mà cá nhân tôi thấy hữu ích. Cài đặt / nâng cấp mới với debiangói r-recommended, như bên dưới, sẽ cung cấp phiên bản mới nhất của tất cả các gói 'được đề xuất' tiêu chuẩn (ví dụ survival). Tôi tin rằng có thể có một độ trễ nhỏ giữa bản phát hành CRAN và bản cập nhật cho debiangói có liên quan . Vì vậy, bạn có thể muốn thêm một số trong số này vào arraybên dưới nếu có phiên bản mới nhất của Rgói 'được đề xuất' là điều cần thiết.

  5. Các debiangói được cài đặt trong quy trình dưới đây cũng không cần thiết (để sử dụng r-base) cũng không đầy đủ nhưng cung cấp không. "tiện ích bổ sung" rất quan trọng đối với số không hợp lý. của Rcác gói.

Dù sao ... đặt sau đây trong R.sh:

sudo apt update && sudo apt --yes full-upgrade
sudo apt install --yes libappstream4 curl
### ov1 = online version; lv1 = local version (i.e. currently installed)
ov1=$(curl --silent --url https://packages.debian.org/sid/r-base |
    grep 'meta name=\"Keywords\"' |
    grep --only-matching '[0-9].*[0-9]') ; echo $ov1
## command -v = print a description of COMMAND similar to the `type' builtin
## && = if prior command succeeds, then do; || = if prior fails, then do
command -v 'R --version' &&
    lv1=$(R --version |
              grep --only-matching '[0-9\.]*[0-9]' |
              ## || = otherwise
              head -1) ||
        lv1=0
## 'lt' = less than
if dpkg --compare-versions "$lv1" 'lt' "$ov1" 
then ## declare -a = indexed array
     declare -a deb1=('r-base' 'r-base-dev' 'r-recommended')
     for i in "${deb1[@]}"
     do sudo apt install --yes "$i"
     done
fi
### certain Debian packages are required by 'R' so best have these first
sudo apt install --yes ccache libcairo2-dev libxml2-dev libcurl4-openssl-dev \
     libssl-dev liblapack-dev libssl-dev
declare -a pkg1=('data.table' 'ggplot2' 'knitr' 'devtools' 'roxygen2')
## installing as 'root' so these are installed in
Rscript -e ".libPaths()[1]"
for i in "${pkg1[@]}"
do sudo Rscript -e "install.packages('$i', dependencies=TRUE)"
done
### other useful additions
sudo apt install --yes libblas-dev libboost-dev libarmadillo-dev \
     jags pandoc pandoc-citeproc 
sudo apt update && sudo apt full-upgrade

Sau đó thực hiện nó, ví dụ như giả sử trong thư mục đã : source R.sh.

Việc cài đặt các gói (dù debianhoặc R) từng cái một trong một vòng lặp từ shell có phần không hiệu quả, nhưng cho phép truy tìm lỗi đơn giản hơn, IMHO. Có thể mất một thời gian tùy thuộc vào không. trong số Rcác gói, vì vậy có thể đơn giản nhất để chạy qua đêm ...


1
Không chắc chắn tại sao 'sự sống sót' lại nằm trong danh sách các gói bổ sung đó. (Và hoàn toàn có thể tôi đang đánh lừa tập lệnh bash này.) Đó là một gói "được đề xuất" kể từ ... mãi mãi. Nếu bạn không cài đặt tất cả các gói được đề xuất với tập lệnh đó, thì nó nên được sửa đổi để làm như vậy. Cũng nghĩ rằng bộ gói r-base-devel sẽ cần thiết cho bất kỳ ai sử dụng linux. Và tại sao không thêm PPA của Michael Rutter?
IRTFM

Cảm ơn bạn! Cập nhật trong ánh sáng của ý kiến ​​hữu ích của bạn. Đồng ý, không cần thường xuyên cài đặt gói đã có sẵn r-recommended. 'r-base-devel' được gọi là r-base-dev( debiangói) - đã được bao gồm. Tôi không phản đối việc sử dụng khóa để bảo mật (cập nhật câu trả lời). Câu trả lời tránh xa việc sử dụng a PPA= Lưu trữ gói cá nhân vì những điều này là do sự cần thiết phụ thuộc vào một người và do đó có khả năng sai lầm. Như chính Michael Rutter đã nói (2012): "Nếu bạn đã sử dụng CRAN, thì không có lý do gì để đổi sang PPA, vì các gói tương tự được cung cấp tại cả hai địa điểm."
dardisco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.