Ricerca…


Osservazioni

La trappola più comune con lo scopo sorge nella parallelizzazione. Tutte le variabili e le funzioni devono essere passate in un nuovo ambiente che viene eseguito su ciascun thread.

Ambienti e funzioni

Le variabili dichiarate all'interno di una funzione esistono solo (se non superate) all'interno di quella funzione.

x <- 1

foo <- function(x) {
    y <- 3
    z <- x + y
    return(z)
}

y

Errore: oggetto 'y' non trovato

Le variabili passate in una funzione e quindi riassegnate vengono sovrascritte, ma solo all'interno della funzione .

foo <- function(x) {
    x <- 2
    y <- 3
    z <- x + y
    return(z)
}

foo(1)
x

5

1

Le variabili assegnate in un ambiente superiore a una funzione esistono all'interno di quella funzione, senza essere passate.

foo <- function() {
    y <- 3
    z <- x + y
    return(z)
}
    
foo()

4

Funzioni secondarie

Le funzioni chiamate all'interno di una funzione (es. Sottofunzioni) devono essere definite all'interno di quella funzione per accedere a qualsiasi variabile definita nell'ambiente locale senza essere passata.

Questo fallisce:

bar <- function() {
    z <- x + y
    return(z)
}
    
foo <- function() {
    y <- 3
    z <- bar()
    return(z)
}

foo()

Errore in bar (): oggetto 'y' non trovato

Questo funziona:

foo <- function() {
    
    bar <- function() {
        z <- x + y
        return(z)
    }
    
    y <- 3
    z <- bar()
    return(z)
}
    
foo()

4

Assegnazione globale

Le variabili possono essere assegnate globalmente da qualsiasi ambiente usando <<- . bar() ora può accedere a y .

bar <- function() {
    z <- x + y
    return(z)
}
    
foo <- function() {
    y <<- 3
    z <- bar()
    return(z)
}

foo()

4

L'incarico globale è altamente scoraggiato. L'uso di una funzione wrapper o di chiamare esplicitamente variabili da un altro ambiente locale è molto preferito.

Assegnazione esplicita di ambienti e variabili

Gli ambienti in R possono essere chiamati e nominati in modo esplicito. Le variabili possono essere assegnate e chiamate esplicitamente da o verso quegli ambienti.

Un ambiente comunemente creato è uno che racchiude il package:base o un sub-ambiente all'interno del package:base .

e1 <- new.env(parent = baseenv())
e2 <- new.env(parent = e1)

Le variabili possono essere assegnate e chiamate esplicitamente da o verso quegli ambienti.

assign("a", 3, envir = e1)
   get("a", envir = e1)
   get("a", envir = e2)

3

3

Poiché e2 eredita da e1 , a è 3 sia in e1 che in e2 . Tuttavia, l'assegnazione di a all'interno di e2 non modifica il valore di a in e1 .

assign("a", 2, envir = e2)
   get("a", envir = e2)
   get("a", envir = e1)

3

2

Funzione Esci

La funzione on.exit() è utile per la pulizia delle variabili se è necessario assegnare variabili globali.

Alcuni parametri, in particolare quelli per la grafica, possono essere impostati solo a livello globale. Questa piccola funzione è comune quando si creano trame più specializzate.

new_plot <- function(...) {
     
     old_pars <- par(mar = c(5,4,4,2) + .1, mfrow = c(1,1))
     on.exit(par(old_pars))
     plot(...)
 }

Pacchetti e mascheratura

Funzioni e oggetti in pacchetti diversi potrebbero avere lo stesso nome. Il pacchetto caricato in un secondo momento "maschera" il pacchetto precedente e verrà stampato un messaggio di avviso. Quando si chiama la funzione per nome, verrà eseguita la funzione del pacchetto caricato più recentemente. È possibile accedere esplicitamente alla funzione precedente.

library(plyr)
library(dplyr)

Allegare il pacchetto: 'dplyr'

I seguenti oggetti sono mascherati da "pacchetto: plyr":

organizzare, contare, desc, failwith, id, mutare, rinominare, riepilogare, riepilogare

I seguenti oggetti sono mascherati da "pacchetto: stats":

filtro, lag

I seguenti oggetti sono mascherati da "pacchetto: base":

intersecano, setdiff, setequal, unione

Quando si scrive codice, è sempre consigliabile chiamare in modo esplicito le funzioni utilizzando package::function() specifico per evitare questo problema.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow