Saem Pakej, difrint Vershunz: Pawsibl?

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(social4i size = „mic” align = „align-left”)

->

(Acest articol a fost publicat pentru prima dată pe R pe biofunctorși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)


Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.

Cat îngrijorat

A început ca un schimb simplu pe Mastodon. Aparent, ceea ce este firesc pentru creierul meu infuzat cu Nix poate părea îndepărtat pentru non-nixers. Versiuni multiple ale aceluiași pachet necesitate Fii posibil. Dar am încercat de fapt asta o singură dată, așa că am decis să -l documentez. Să ne tăiem la goană.

Tl; dr

Puteți instala într -adevăr același pachet de două ori (cu versiuni diferite), atât timp cât sunt pe căi diferite. Poate că sunteți deja familiarizați cu calea bibliotecii utilizatorilor (de exemplu, ~/R/4.5/unde puteți instala pachete) și cel de sistem (de exemplu /usr/lib/R/site-libraryunde numai rădăcina poate). Nu există niciun motiv pentru care nu puteți avea multe alte biblioteci de utilizatori și fiecare ar putea avea propriile sale
{tidyr} Pachet, de exemplu. Trebuie doar să -l adăugați, ca așa:

paths_backup <- .libPaths()
.libPaths(c("/home/user/my_fancy_new_R_lib", paths_backup))

Puteți instala un alt Tidyr în acea nouă bibliotecă.

url_tidyr100 <- "https://cran.r-project.org/src/contrib/Archive/tidyr/tidyr_1.0.0.tar.gz"
install.packages(
    url_tidyr100,
    repos=NULL,
    type="source",
    lib = "/home/user/my_fancy_new_R_lib"
)

Apoi, puteți alege ce versiune a unui pachet să vă încărcați cu
lib.loc opțiunea library() funcție (verificați ?library pentru detalii). Puteți utiliza și detach() Pentru a elimina acest pachet din calea de căutare și adăugați celălalt în aceeași sesiune.

Deci, cum arată acest lucru în practică?

Poate arăta foarte diferit, în funcție de modul de lucru. De când am descoperit Nix, nu -mi pot imagina o modalitate mai bună de a gestiona software -ul pe computerul meu, așa că voi folosi asta. Pentru a -mi face viața puțin mai ușoară, folosesc {rix} Pachet pentru a demo asta. După cum vedeți în a treia linie, îi cer să creeze un mediu cu două
{tidyr}-s.

rix::rix(
    r_ver = "4.5.0",
    r_pkgs = c("tidyr", "[email protected]"),
    ide = "radian",
    overwrite = TRUE,
    project_path = "./",
    print = FALSE
)

Acest lucru va genera un default.nix Fișier în directorul de lucru curent, care este un bun punct de plecare, dar trebuie modificat puțin. Conectez rezultatul final aici. Puteți descărca acest fișier, îl puteți pune într -un folder, instala NIX (nu vă faceți griji, nu rupe nimic) și faceți un nix-shell comanda. Acum ești exact în același mediu ca mine. Am putea spune că suntem invitați. Minunat, zici? Știu.

Odată ce tastați radian În consolă, puteți vedea că avem un .libPaths()
cu 49 de dosare; Fiecare pachet, pentru că așa funcționează Nix. Două dintre acestea sunt {tidyr}. Să le găsim!

rpkgs <- installed.packages()

(tidyr_liblocs <- setNames(
    object = rpkgs(rpkgs(,"Package") == "tidyr","LibPath"),
    nm = paste0("v", rpkgs(rpkgs(,"Package") == "tidyr","Version"))
))
##                                                              v1.3.1 
## "/nix/store/350xssybshpbpzi1kdryvgwh05kz910l-r-tidyr-1.3.1/library" 
##                                                              v1.0.0 
## "/nix/store/42iyfzgjays8mdk3r9yzplamkjhz2as9-r-tidyr-1.0.0/library"

Între versiunile respective, constrângerea în replace_na()
Funcția a fost făcută ilegală, astfel încât să putem efectua un test rapid.

# Looks familiar?
test_seq <- c(1, 1, 2, 3, NA, 8, 13)

# Let's attach the old version first
library(
    tidyr,
    lib.loc = tidyr_liblocs("v1.0.0")
)

# Coerce numeric to string
replace_na(test_seq, "5")
## (1) "1"  "1"  "2"  "3"  "5"  "8"  "13"
# Save it for later
old_replace_na <- replace_na

# Let's detach this old tidyr
detach("package:tidyr", character.only = TRUE)
# and attach the newer one
library(
    tidyr,
    lib.loc = tidyr_liblocs("v1.3.1")
)

# Try to coerce numeric to string
try(replace_na(test_seq, "5"))
## Error in vec_assign(data, missing, replace, x_arg = "data", value_arg = "replace") : 
##   Can't convert `replace` <character> to match type of `data` <double>.
# Save it for later
new_replace_na <- replace_na

detach("package:tidyr", character.only = TRUE)

Deci, acest lucru funcționează așa cum era de așteptat. Dar acest atașat-detaș este un pic enervant. Am putea folosi cele două funcții în același timp, fără a fi nevoie să parcurgem o mulțime de hocus-pocus cu calea de căutare? Ei bine, ca să fiu sincer, nu puteam găsi cu adevărat o modalitate bună de a evita mai întâi să încarc pacakge sau spațiu de nume. Dacă tu do Știi să folosești ceva de genul getFromNamespace()dar cu lib.loc opţiune,
Vă rog, vă rog, anunțați -mă!

Deocamdată, am salvat doar funcțiile cu enquosurile lor, adică mediul lor în spațiul de nume al pachetului respectiv, care include alte funcții pe care le „le văd” și le folosesc. Ca atare, ele pot fi numite în viitor fără ciclul de atașare-detașare.

try(old_replace_na(test_seq, "5"))
## (1) "1"  "1"  "2"  "3"  "5"  "8"  "13"
try(new_replace_na(test_seq, "5"))
## Error in vec_assign(data, missing, replace, x_arg = "data", value_arg = "replace") : 
##   Can't convert `replace` <character> to match type of `data` <double>.

Avertismente

În acest moment, puteți fi impresionat. Nu vă faceți griji, acest lucru este perfect normal. Cu toate acestea, trebuie să vă dezamăgesc: acest lucru nu va funcționa de fiecare dată, sau cel puțin nu atât de „ușor”. Când am încercat același lucru cu {tidyr} versiunea 0.7.0, nu a reușit să instaleze deoarece curentul {purrr} nu a exportat o funcție de care avea nevoie. Deci ar fi fost necesară modificări suplimentare. Aș fi trebuit să instalez mai vechi
{purrr}faceți -l să depindă de asta, etc. Nu sunt sigur dacă este chiar posibil fără a redenumi întregul pachet.

Inițial, am vrut să scriu această postare cu {Seurat} V3 vs v4 vs v5. Dar versiunile mai vechi nu au reușit să se instaleze din cauza dependențelor rupte, care au fost retrase de la CRAN de atunci. Pentru a rezuma, acest lucru va funcționa probabil doar pentru pachete relativ recente și simple. Pachetele cu multe dependențe sau cele care sunt foarte vechi sunt mai susceptibile să fie incompatibile cu depencențele lor actuale.

În aceste cazuri, este probabil mai productiv să creăm un mediu separat de o instantanee datată (de exemplu, RSTATS-on-NIX, POSIT PACKET MANAGER,
{groundhog} sau similar). În acest fel, vă puteți testa întotdeauna scriptul, puteți face comparații sau orice ar fi obiectivul dvs.

Cu NIX, acesta este un lucru foarte natural de făcut, care asigură că toate mediile dvs. dev și va continua să funcționeze. În prezent, am 8 versiuni diferite de R, 5 Rstudios și 3 Dlyr-S instalate. Ei coexistă în mod pașnic și nu intră niciodată în conflict între ei. Dacă ceva trebuie testat pe diferite versiuni R, versiuni de pachete sau alte biblioteci, aceasta este o configurație excelentă.

La Lasă un comentariu Pentru autor, vă rugăm să urmați linkul și să comentați pe blogul lor: R pe biofunctor.

Oferte R-Bloggers.com Actualizări zilnice prin e-mail Despre știri și tutoriale despre învățarea R și multe alte subiecte. Faceți clic aici dacă doriți să postați sau să găsiți o lucrare R/Data-Science.


Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.

Continuați să citiți: Saem Pakej, difrint Vershunz: Pawsibl?

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.