(Acest articol a fost publicat pentru prima dată pe Jottr pe rș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.
viitor Pachetul sărbătorește zece ani pe CRAN începând cu 19 iunie 2025. Aceasta este prima dintr -o serie de postări pe blog care evidențiază îmbunătățiri recente la futureverse Ecosistem.
Globaluri Pachetul face parte din Futureverse și a avut două versiuni recente la 2025-04-15 și 2025-05-08. Aceste actualizări abordează câteva cazuri de colț care altfel ar duce la erori neașteptate. De asemenea, au rezultat în mai multe probleme lungi și restante raportate la
viitor, viitor.apply, Furrrși dofutură
Trackerii de emitere a pachetului, și în alte părți, ar putea fi închise.
Actualizarea semnificativă este că findGlobals()
a obținut argument
method = "dfs"
care găsește Globals în expresiile R, mergând arborele său de sintaxă abstract (AST) folosind un Primul căutare în profunzime
Algoritm. Această nouă abordare face o treabă mai bună de a emite modul în care motorul R identifică variabilele globale, ceea ce duce la o călătorie și mai lină pentru oricine folosește Futureverse pentru procesare paralelă și distribuită. Anterior, un algoritm de căutare modificat adoptat de la codetools::findGlobals()
a fost folosit. Codetools
Algoritmul de căutare este proiectat în principal pentru R CMD check
pentru a detecta variabile nedefinite utilizate în codul pachetului. Pentru a limita numărul de falsuri pozitive raportate de R CMD check
astfel de algoritmi tind să fie „conservatori” prin natură, astfel încât să putem avea încredere în ceea ce este raportat. Această strategie nu este întotdeauna suficientă pentru detectarea automată a globalilor necesare în procesarea paralelă. Ca exemplu, în
fcn <- function() { a <- b b <- 1 }
variabil b
este o variabilă globală, dar dacă ne întrebăm Codetoolsnu ridică b
ca global;
codetools::findGlobals(fun) #> (1) "{" "<-"
Acest fals negativ este în regulă pentru R CMD check
dar, în schimb, pentru procesarea paralelă, trebuie să folosim un algoritm de căutare „liberal”. În procesare paralelă, este în regulă să ridici și să exporte prea multe variabile către lucrătorul paralel. Dacă nu se folosește o variabilă, se face puțin prejudiciu, dar dacă nu vom exporta o variabilă necesară, vom ajunge la o eroare cu obiect-nu-fund. Futureverse a folosit încă din primele zile (decembrie 2015) o versiune modificată a Codetools
algoritm care este liberal, dar nu prea liberal. Detectează b
ca variabilă globală;
globals::findGlobals(fun) #> (1) "{" "<-" "b"
Această strategie de căutare liberală se dovedește a funcționa surprinzător de bine pentru detectarea globalelor necesare în procesarea paralelă, dar au existat cazuri de colț în care a eșuat. De exemplu, futureverse s -a străduit să identifice variabilele globale în cazuri precum:
library(future) plan(multisession, workers = 2) x <- 2 f <- future(local({ h <- function(x) -x h(x) })) value(f)
ceea ce a dus la
Error in eval(quote({ : object 'x' not found
Acest lucru se datorează faptului că există mai multe variabile diferite numite x
iar cel din mediul de apel este „mascat” de argument x
ceea ce rezultă în x
Nu fiți niciodată ridicat și exportat la lucrătorul paralel.
S -ar putea să pară ca și cum acest tip de cod ar fi fost curat cu atenție pentru a eșua, dar rareori, dacă este deloc, ar fi observat în cod real. De fapt, aceasta este o versiune distilată a unui scenariu mare din lumea reală raportată de cel puțin o persoană. Este datorită unui astfel de feedback că împreună putem aduce îmbunătățiri futureverse ecosistem 🙏 Nu pot ști sigur, dar aș bănui că acest lucru a afectat deja mai mulți dezvoltatori R – viitor Pachetul este până la urmă printre cele mai multe pachete de 0,6% descărcate și există 1.300 de pachete care „au nevoie” din mai 2025. Problema de mai sus a fost rezolvată în Globaluri 0,18,0 (2025-05-08) și viitor 1.49.0 (2025-05-09), care acum folosesc noul findGlobals(..., method = "dfs")
Strategia de căutare internă. După actualizarea acestor pachete, fragmentul de cod de mai sus ne oferă
value(f) #> (1) -2
Așa cum ne -am aștepta.
O altă soluție de eroare a cazurilor de colț este unde
library(future) library(magrittr) x <- list() f <- future ({ x %>% `$<-`("a", 42) })
ar duce la eroarea destul de obscură
Error in e((4)) : subscript out of bounds
Acest lucru se datorează unei erori în
Codetools pachet, care Globaluri (> = 0,17,0) (2025-04-15) funcționează în jur. După actualizare, lucrurile funcționează așa cum era de așteptat;
f <- future ({ x %>% `$<-`("a", 42) }) value(f) #> $a #> (1) 42
Încă o soluție în Globaluri (> = 0.17.0) este că versiunile anterioare ar arunca o eroare dacă ar intra într -un obiect S7. Clasa de obiect S7 a fost introdusă în 2023.
Fie ca viitorul să fie cu tine!
Henrik
PS. Știați că Codetools Pachetul este scris folosind programarea alfabetizată în urma viziunii lui Donald Knuth? Îngrijit, nu? Și, este aproape ca și cum ar fi fost codificat, dar cu partea de modele de mare limbă (LLM) fiind înlocuită de cunoștințe și expertiză umană 🤓