Domanda

C'è un modo, in R, ad apparire un messaggio di errore se una funzione utilizza una variabile non dichiarate nel corpo della funzione: cioè, voglio qualcuno per segnalare questo tipo di funzioni

aha<-function(p){
  return(p+n)
}

vedi; se vi capita di essere un "n" variabile che giace da qualche parte, aha (p = 2) mi darà una "risposta", in quanto R vorrà solo "n" da quel luogo misterioso chiamato l ' "ambiente"

È stato utile?

Soluzione

Se si desidera rilevare tali problemi potenziali durante la fase di scrittura in codice e non in fase di esecuzione, quindi il pacchetto codetools è tuo amico.

library(codetools)
aha<-function(p){ 
  return(p+n) 
}

#check a specific function:
checkUsage(aha) 

#check all loaded functions:
checkUsageEnv(.GlobalEnv)

Questi vi dirà che no visible binding for global variable ‘n’.

Altri suggerimenti

Il suggerimento di Richie è molto buona.

Vorrei solo aggiungere che si dovrebbe prendere in considerazione la creazione di casi di test unità che avrebbe eseguito in un ambiente pulito R. Che anche eliminare la preoccupazione per le variabili globali e assicura che le funzioni si comportano il modo in cui dovrebbero. Si potrebbe voler considerare l'utilizzo runit per questo. Ho la mia suite di test in programma per l'esecuzione ogni notte in un nuovo ambiente utilizzando rscript, e questo è molto efficace e la cattura di qualsiasi tipo di problemi di portata, ecc.

Scrivendo codici R per controllare altro codice R sta per essere difficile. Dovreste trovare un modo per determinare quali parti di codice sono state dichiarazioni di variabili, e quindi cercare di capire se avevano già state dichiarate all'interno della funzione. EDIT: La dichiarazione precedente sarebbe stato vero, ma come Aniko ha sottolineato, il duro lavoro è già stato fatto nel pacchetto codetools .

Una cosa correlata che può essere utile per voi è quello di forzare una variabile che deve essere preso dalla funzione stessa (piuttosto che da un ambiente che racchiude).

Questa versione modificata della funzione avrà sempre esito negativo, dal momento che n non è dichiarata.

aha <- function(p) 
{ 
   n <- get("n", inherits=FALSE)
   return(p+n)
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top