2014-06-17 2 views
7

Uso la R 3.0.2 su Ubuntu 14. Eseguo alcuni calcoli pesanti nel mio codice e ho provato il pacchetto "compiler" conUtilizzo del pacchetto di compilazione e soppressione "Nessuna associazione visibile per la variabile globale"

compilePKGS(enable=TRUE) 
enableJIT(3) 

E sembra velocizzare il mio codice. Molto bella!

Ma ogni volta il mio pacchetto permette al "compilatore", ho un sacco di note come

Note: no visible binding for global variable '.Data' 

o qualcosa di simile con i miei oggetti S4 (la sua "obj risultato @" nel codice):

Note: no visible binding for global variable 'result' 

che è, ad esempio, parte di un oggetto S4 creato da sé. L'aggiunta di setCompilerOptions("suppressAll", TRUE) o setCompilerOptions("suppressUndefined", TRUE) non ha aiutato. Quando disattivo completamente il pacchetto del compilatore, non appaiono affatto note, quindi questo potrebbe essere un problema con la mia comprensione del pacchetto compilatore/jit?

Cosa posso fare per sopprimere queste note?

Edit:

require(compiler) 
compilePKGS(enable=TRUE) 
enableJIT(3) 



setClass(Class = "testobject", 
     slots = c(data  = "numeric", 
        test  = "character", 
        split = "numeric", 
        name  = "character" 
     ) 
) 

a <- new("testobject", data=c(1,2,3,4), test="TEST", split=5, name="NAME") 

for(i in [email protected]){ 
    print(i) 
} 

Semplice esempio produce

Note: no visible binding for global variable '.Data' 
Note: no visible binding for global variable '.Data' 

direttamente dopo la definizione della classe chiamata

+0

È possibile nascondere tali note se si definisce '.Data' (ad esempio, aggiungere' .Data <- NULL' all'inizio dello script). Non sono del tutto sicuro del motivo per cui è stato pubblicato qui, quindi forse qualcun altro può confermare che questa è una cosa salvifica da fare. –

+0

Sì, è vero, ho trovato una risposta simile in [link] (http://stackoverflow.com/a/23476834/2720455), ma la cosa divertente è che questi messaggi non compaiono quando disattivo il compilatore o il jit (3). La soluzione alternativa nel thread collegato crea variabili nell'ambiente. Non penso che sia appropriato per un pacchetto? Questo si sente associato al compilatore o mi sto perdendo qualcosa? Grazie per l'aiuto! :) – Marc

+1

@Marc Hai mai trovato una soluzione? –

risposta

7

È possibile eliminare queste note da R utilizzando

setCompilerOptions(suppressAll = TRUE)

Non è necessario sopprimere separatamente le opzioni "indefinite", eliminando "tutto". In alternativa, è possibile impostare la variabile di ambiente

export R_COMPILER_SUPPRESS_ALL=true (o in modo simile in sistemi operativi diversi).

Se si voleva sopprimere solo avvertimenti sulle variabili che sono o sembrano essere undefined al compilatore, si può fare

setCompilerOptions(suppressUndefined=TRUE)

E se si voleva fare questo solo per la variabile .Data, è possibile do

setCompilerOptions(suppressUndefined=".Data").

Nota inoltre non è necessario abilitare la compilazione di pacchetti quando si utilizza il compilatore per accelerare il codice, tutto ciò che è necessario è abilitare il JIT.Puoi farlo da R come nel tuo esempio, o semplicemente impostando un'altra variabile

export R_ENABLE_JIT=3

Per abilitare ottimizzazioni più aggressive, è possibile anche impostare

export R_COMPILER_OPTIMIZE=3

o da R eseguire setCompilerOptions(optimize=3)

Quando si abilita la compilazione JIT tramite la variabile di ambiente, non è necessario caricare esplicitamente il pacchetto del compilatore - verrà eseguito automaticamente.

+0

Sì! Grazie. Sono sorpreso di non aver visto la suppressAll = TRUE altrove, ma questo ha fatto il trucco per me. –

+0

L'impostazione delle opzioni del compilatore è trattata nel manuale (? SetCompilerOptions), una nuova versione di R avrà anche un esempio per renderla più chiara. –

3

È possibile definire una variabile globale utilizzando, ad esempio

utils::globalVariables(".Data") 

Questo consentirà di evitare il "no visibile vincolante per la variabile globale" NOTA.

Questo ha il vantaggio di sopprimere tutti i messaggi del compilatore a cui è destinato; non sopprimerai altri, utili, messaggi del compilatore.

+1

Se si desidera sopprimere solo questo avviso particolare, il modo previsto per farlo è tramite setCompilerOptions (suppressUndefined = ". Dati"). –