Rlang - Tek Satırda Çoklu Paket Yönetimi
R programlama dilinde, kullanacağımız paketleri duruma göre library()
ve/veya require()
fonksiyonları ile çağırırız. Elbette, genel kullanım library()
fonksiyonudur. Çünkü, require()
koduna baktığımızda bu fonksiyonun da arkaplanda library()
fonksiyonunu kullandığını görebiliriz1 2.
Konuyla ilgili olarak yazının alt bölümünde yer alan ileri okumalar başlığına göz atabilirsiniz.
library(package, help, pos = 2, lib.loc = NULL,
character.only = FALSE, logical.return = FALSE,
warn.conflicts = TRUE, quietly = FALSE,
verbose = getOption("verbose"))
require(package, lib.loc = NULL, quietly = FALSE,
warn.conflicts = TRUE,
character.only = FALSE)
R Dili'nde Paket Yönetimi
Kullanımımız hangi fonksiyon olursa olsun, kodumuz içerisinde ihtiyaç duyduğumuz her paket için ayrı ayrı tanımlanma yapmak durumundayız. Elbette, sadece ihtiyacınız olduğunda bir paketi kullanmak isteyebilir ve kodun ilk satırları yerine paketi gerekli zamanda çağırabilirsiniz. Birkaç paket için sorun olmayan bu durum paket sayısına paralel olarak canınızı sıkabilir.
library(dplyr)
library(ggplot2)
library(RMySQL)
library(data.table)
...
Peki, bu durumun bir çözümü var mı? Elbette, var.
lapply
lapply
çözümlerden biri. Aldığı değeri bir sonraki argümana aktararak, liste ve vector boyunca bir fonksiyonun uygulanması sağlayan lapply
ile belirttiğiniz paketlerin tek satır üzerinden yüklenmesini sağlayabiliriz. Fonksiyonun temel kullanımı şu şekilde:
lapply(.x, .f, ...)
- .x: Vektör
- .f: Uygulanacak fonksiyon
- …: .f için uygulanacak ek opsiyonel argümanlar
lapply
kullanımına dair bir örnek oluşturmak gerekirse aynı satır üzerinden devtools
ve grid
paketlerini indirebiliriz.
lapply(c("...", "..."), require, character.only = TRUE)
Komut sonrasında alacağınız dönüş şu şekilde olacaktır:
lapply(c("devtools", "grid"), require, character.only = TRUE)
Loading required package: devtools
Loading required package: grid
[[1]]
[1] TRUE
[[2]]
[1] TRUE
Eğer aktifleştireceğiniz paket yüklü değilse install.packages
için False
dönüşü alırsınız.
lapply(c("arutil", "googleformr"), require, character.only = TRUE)
Loading required package: arutil
Loading required package: googleformr
[[1]]
[1] TRUE
[[2]]
[1] FALSE
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
there is no package called ‘googleformr’
pacman
pacman
R paket yönetimi sürecini oldukça kolaylaştıran oldukça başarılı paketlerden biri.
p_load
fonksiyonuyla birlikte tek satır üzerinden çoklu paket yükleme ve aktifleştirme işlemlerini yürütebilmekte. Yukarıdaki lapply örneğinde karşılaştığımız, tanımlanan paketin yüklü olmaması durumunda false dönüşü yerine paketin indirip aktifleştirilmekte. pacman
ve barındırdığı fonksiyonlarla ilgili daha geniş bilgiye CRAN ulaşabilirsiniz3. Fonksiyon kullanımlarını ise şu şekilde örneklendirebiliriz.
library(pacman)
pacman::p_load(dplyr, psych, tm) # ön tanımlı kullanım
p_load_gh("Dasonk/githubSearch", "trinker/regexr", "hadley/httr@v0.4") # github üzerinden paket edinimi
lubripack
Bir diğer alternatif paket ise lubripack
. Paket işlev olarak belirtilen paketler yüklü ise aktifleştirmekte, yüklü olmayan paketleri yükleyerek kullanıma hazır hale getirmekte. Aktif olarak geliştirilmeyen, ancak kaynak kodlarını github sayfasın üzerinden görüntüleyerek geliştirmeye devam edebileceğiniz pakete GitHub üzerinden ulaşabilirsiniz4.
library(devtools)
devtools::install_github("espanta/lubripack")
library(lubripack)
lubripack("anytime", "animation", "adabagL", silent = FALSE)
easypackages
Her paketi library
fonksiyonuyla ilişkili olarak aktifleştiren, sahip olunmayan paketlerin de yüklenmesini sağlayan easypackages
paketi libraries
ve packages
fonksiyonları üzerinden yönetilebilmekte. Daha detaylı bilgi için GitHub sayfasını inceleyebilirsiniz5. İndirme ve kullanımına dair örnekler ise şu şekilde:
install.packages("easypackages")
library(easypackages)
libraries("dplyr", "ggplot2")
paketlerim <- c("RMySQL", "Rdatatable/data.table")
packages(paketlerim)
Elbette basit bir işlem için harici paketlere ne kadar ihtiyaç olduğu ve/veya bunun ne kadar işlevsel olacağı tartışılabilir. Ancak, paketleri dinamik olarak iletmeniz veya kodunuzu farklı bir ortamda çalıştırmak durumunda olabilirsiniz. Bu tür durumlarda elbette standart yolların dışına çıkmamız gerekebilmekte.