Saya tampaknya berbagi banyak kode dengan rekan penulis hari ini. Banyak dari mereka adalah pengguna R pemula dan menengah dan tidak menyadari bahwa mereka harus menginstal paket yang belum mereka miliki.
Apakah ada cara yang elegan untuk menelepon installed.packages()
, bandingkan dengan yang saya muat dan instal jika tidak ada?
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
.base
... ;-)Jawaban:
Iya. Jika Anda memiliki daftar paket, bandingkan dengan output dari
installed.packages()[,"Package"]
dan instal paket yang hilang. Sesuatu seperti ini:Jika tidak:
Jika Anda memasukkan kode Anda dalam sebuah paket dan menjadikannya dependensi, maka mereka akan secara otomatis diinstal ketika Anda menginstal paket Anda.
sumber
if(length(new.packages)>0) {install.packages(new.packages)}
new.packages <- c(1,2)
length(new.packages)
if(length(new.packages)){print("hello!")}else{print("oh no!")}
require
daripada memeriksainstalled.packages
packrat
dibuat untuk ini. Ini adalah sistem manajemen paket yang dapat direproduksi. Cara ini terjadi dengan cara yang salah dan mengacaukan lingkungan orang lain dan tidak dapat direproduksi. Packrat memiliki folder dan lingkungannya sendiri untuk pustaka bersama. rstudio.github.io/packratDason K. dan saya memiliki paket pacman yang dapat melakukan ini dengan baik. Fungsi
p_load
dalam paket melakukan ini. Baris pertama hanya untuk memastikan bahwa pacman diinstal.sumber
/
dan, jika ditemukan, instal / muat dari github secara otomatis.if (!require("pacman")) install.packages("pacman")
ada fungsi dalam pacman disebutp_boot()
maks baris ini untuk Anda secara otomatis dan menyalinnya ke clipboard.Anda bisa menggunakan nilai pengembalian
require
:Saya menggunakan
library
setelah instalasi karena akan mengeluarkan pengecualian jika instalasi tidak berhasil atau paket tidak dapat dimuat karena alasan lain. Anda menjadikan ini lebih kuat dan dapat digunakan kembali:Kelemahan dari metode ini adalah Anda harus memberikan nama paket dalam tanda kutip, yang sebenarnya tidak Anda lakukan
require
.sumber
character.only = TRUE
direquire
, tapi kemudian saya kira tidak ada yang membedakan jawaban Anda dari tambang."ggplot2" adalah paketnya. Ia memeriksa untuk melihat apakah paket diinstal, jika tidak menginstalnya. Itu kemudian memuat paket terlepas dari cabang yang dibutuhkan.
sumber
Solusi ini akan mengambil vektor karakter dari nama paket dan mencoba memuatnya, atau menginstalnya jika pemuatan gagal. Itu bergantung pada perilaku pengembalian
require
untuk melakukan ini karena ...Karena itu kita bisa melihat apakah kita dapat memuat paket yang diperlukan dan jika tidak, instal dengan dependensi. Jadi diberi vektor karakter paket yang ingin Anda muat ...
sumber
require
lagi setelah menginstal?if
pernyataan dievaluasi terlebih dahulu harus dievaluasirequire
, efek sampingnya memuat paket jika tersedia!install.packages
, karena ini tidak akan memuat paket itu. Tetapi (untuk @krlmlr) saya menduga maksudnya adalah bahwa fragmen kode ini hanya akan dipanggil sekali; Anda tidak akan menulis ini setiap kali Anda membutuhkan paket. Sebaliknya Anda akan menjalankannya sekali sebelumnya dan kemudian meneleponrequire
seperti biasa sesuai kebutuhan.require
panggilan kedua untuklibrary
sehingga gagal ribut jika masih tidak dapat melampirkan paket karena beberapa alasan?Banyak jawaban di atas (dan duplikat dari pertanyaan ini) bergantung pada
installed.packages
bentuk mana yang buruk. Dari dokumentasi:Jadi, pendekatan yang lebih baik adalah mencoba memuat paket menggunakan
require
dan menginstal jika pemuatan gagal (require
akan kembaliFALSE
jika tidak ditemukan). Saya lebih suka implementasi ini:yang bisa digunakan seperti ini:
Dengan cara ini memuat semua paket, lalu kembali dan menginstal semua paket yang hilang (yang jika Anda mau, adalah tempat yang berguna untuk memasukkan prompt untuk menanyakan apakah pengguna ingin menginstal paket). Alih-alih memanggil
install.packages
secara terpisah untuk setiap paket, ia hanya mengirimkan seluruh vektor paket yang dihapus instalasinya sekali saja.Berikut fungsi yang sama tetapi dengan dialog windows yang menanyakan apakah pengguna ingin menginstal paket yang hilang
sumber
Walaupun jawaban Shane sangat bagus, untuk salah satu proyek saya, saya perlu menghapus pesan, peringatan, dan menginstal paket ouput secara otomatis . Saya akhirnya berhasil mendapatkan skrip ini:
Menggunakan:
sumber
sumber
Ini adalah tujuan dari paket rbundler : untuk menyediakan cara untuk mengontrol paket-paket yang diinstal untuk proyek tertentu. Saat ini paket bekerja dengan fungsi devtools untuk menginstal paket ke direktori proyek Anda. Fungsionalitasnya mirip dengan bundler Ruby .
Jika proyek Anda adalah sebuah paket (disarankan) maka yang harus Anda lakukan adalah memuat rbundler dan menggabungkan paket-paket tersebut. The
bundle
fungsi akan melihat paket AndaDESCRIPTION
berkas untuk menentukan paket bundel.Sekarang paket akan diinstal di direktori .Rundle.
Jika proyek Anda bukan paket, maka Anda bisa memalsunya dengan membuat
DESCRIPTION
file di direktori root proyek Anda dengan bidang Tergantung yang mencantumkan paket yang ingin Anda instal (dengan informasi versi opsional):Inilah repo github untuk proyek ini jika Anda tertarik untuk berkontribusi: rbundler .
sumber
Tentu.
Anda perlu membandingkan 'paket yang diinstal' dengan 'paket yang diinginkan'. Itu sangat dekat dengan apa yang saya lakukan dengan CRANberries karena saya perlu membandingkan 'paket yang dikenal tersimpan' dengan 'paket yang dikenal saat ini' untuk menentukan paket baru dan / atau yang diperbarui.
Jadi lakukan sesuatu seperti
untuk mendapatkan semua paket yang dikenal, panggilan simular untuk paket yang diinstal saat ini dan bandingkan dengan paket target yang diberikan.
sumber
Gunakan
packrat
agar pustaka bersama sama persis dan tidak mengubah lingkungan orang lain.Dalam hal keanggunan dan praktik terbaik, saya pikir Anda pada dasarnya akan melakukannya dengan cara yang salah. Paket
packrat
ini dirancang untuk masalah ini. Ini dikembangkan oleh RStudio oleh Hadley Wickham. Alih-alih mereka harus menginstal dependensi dan mungkin mengacaukan sistem lingkungan seseorang,packrat
gunakan direktori sendiri dan instal semua dependensi untuk program Anda di sana dan tidak menyentuh lingkungan seseorang.https://rstudio.github.io/packrat/
sumber
Fungsi sederhana berikut berfungsi seperti pesona:
(bukan milikku, menemukan ini di web beberapa waktu lalu dan telah menggunakannya sejak itu. tidak yakin dengan sumber aslinya)
sumber
Saya menggunakan fungsi berikut untuk menginstal paket jika
require("<package>")
keluar dengan paket tidak ditemukan kesalahan. Ini akan meminta baik - repositori CRAN dan Bioconductor untuk paket yang hilang.Diadaptasi dari karya asli oleh Joshua Wiley, http://r.789695.n4.nabble.com/Install-package-automatically-if-not-ther-td2267532.html
Contoh:
PS:
update.packages(ask = FALSE)
&biocLite(character(), ask=FALSE)
akan memperbarui semua paket yang diinstal pada sistem. Ini bisa memakan waktu lama dan menganggapnya sebagai upgrade R penuh yang mungkin tidak dijamin sepanjang waktu!sumber
loadpack()
di raw.githubusercontent.com/holgerbrandl/datautils/master/R/…Anda cukup menggunakan
setdiff
fungsi untuk mendapatkan paket yang tidak diinstal dan kemudian menginstalnya. Dalam contoh di bawah ini, kami memeriksa apakahggplot2
danRcpp
paket diinstal sebelum menginstalnya.Dalam satu baris, yang di atas dapat ditulis sebagai:
sumber
installed.packages()[,'Package']
bukanrownames(installed.packages())
.Saya telah mengimplementasikan fungsi untuk menginstal dan memuat paket R yang diperlukan secara diam-diam. Semoga bisa membantu. Ini kodenya:
sumber
Versi RStudio (1.2) yang akan datang, sudah tersedia sebagai pratinjau, akan menyertakan fitur untuk mendeteksi paket
library()
danrequire()
panggilan yang hilang , dan meminta pengguna untuk menginstalnya:Hal ini tampaknya menyikapi keprihatinan asli OP dengan sangat baik:
sumber
Mengenai tujuan utama Anda "untuk menginstal perpustakaan yang belum mereka miliki." Dan terlepas dari menggunakan "instllaed.packages ()". Fungsi berikut menutupi fungsi asli yang diminta. Mencoba memuat dan memeriksa paket bernama "x", jika tidak diinstal, instal langsung termasuk dependensi; dan terakhir memuatnya secara normal. Anda mengganti nama fungsi dari 'wajib' ke 'perpustakaan' untuk menjaga integritas. Satu-satunya batasan adalah nama paket harus dikutip.
Jadi Anda dapat memuat dan menginstal paket dengan cara mode lama dari R. Butuhkan ("ggplot2") memerlukan ("Rcpp")
sumber
delete
tautan di atas komentar ini. Jika tidak, dan Anda masih ingin menghapus, gunakanflag
tautan, pilih "lain", dan jelaskan kepada moderator bahwa Anda ingin jawabannya dihapus.Cukup mendasar.
sumber
Saya pikir saya akan berkontribusi yang saya gunakan:
sumber
sumber
Menggunakan pendekatan keluarga lapply dan fungsi anonim, Anda dapat:
||
evaluasi malas).Cetak setiap paket status pemuatan akhir (
TRUE
/FALSE
).sumber
Saya menggunakan yang berikut ini yang akan memeriksa apakah paket diinstal dan jika dependensi diperbarui, kemudian memuat paket.
sumber
Ini kode saya untuk itu:
sumber
sumber
Ini berfungsi dengan nama paket yang tidak dikutip dan cukup elegan (lih. Jawaban GeoObserver)
sumber
Dalam kasus saya, saya ingin satu liner yang dapat saya jalankan dari commandline (sebenarnya melalui Makefile). Berikut adalah contoh menginstal "VGAM" dan "feather" jika belum diinstal:
Dari dalam R itu hanya akan:
Tidak ada apa pun di sini selain solusi sebelumnya kecuali bahwa:
repos
parameter (untuk menghindari sembulan menanyakan tentang mirror untuk digunakan)Perhatikan juga yang penting
character.only=TRUE
(tanpa itu,require
akan mencoba memuat paketp
).sumber
sumber
Biarkan saya berbagi sedikit kegilaan:
sumber