2012-05-08 18 views
11

Se ho bisogno di utilizzare un set di dati all'interno di una funzione (come tabella di ricerca) all'interno di un pacchetto che sto creando, devo caricare esplicitamente il set di dati all'interno della funzione?Dati all'interno di una funzione (creazione pacchetto)

La funzione e il set di dati sono entrambi parte del pacchetto.

È questo il modo corretto di utilizzare tali dati impostato all'interno della funzione:

foo <- function(x){ 
    x <- dataset_in_question 
} 

o è questo meglio:

foo <- function(x){ 
    x <- data(dataset_in_question) 
} 

o c'è qualche approccio non sto pensando a questo è corretto ?

+0

Mhh ... Vorrei utilizzare le funzioni di applicazione nella funzione e utilizzare la funzione sul set di dati, ma forse questa non è un'opzione in questo caso ... – Mikko

+0

Sono quasi sicuro che sia l'opzione (1) . AFAIK, tu usi 'data()' per i suoi effetti collaterali, non il suo valore di ritorno. In effetti, il valore restituito da 'data()' è semplicemente il nome del set di dati, non la variabile attuale. Prova, per esempio, 'x <- data (iris)' e vedi cosa succede. – Andrie

+0

Se si utilizza solo il set di dati come tabella di ricerca e non lo si modifica, è necessario creare un nuovo oggetto identico? Se è necessario, puoi considerare di aggiungere la tabella come argomento formale alla tua funzione ('x = dataset_in_question'). – BenBarnes

risposta

1

si può solo mettere il set di dati in un file .rda nella cartella R come descritto da Hadley qui: http://r-pkgs.had.co.nz/data.html#data-sysdata

Matthew Jockers utilizza questo approccio nel syuzhet pa completo costituito per insiemi di dati contenenti i dati bing impostati come visto a ~ linea 452 qui: https://github.com/mjockers/syuzhet/blob/master/R/syuzhet.R

bing non è disponibile per l'utente, ma è al pacchetto come dimostrato da: syuzhet:::bing

Essenzialmente, il comando devtools::use_data(..., internal = TRUE) imposterà tutto nel modo in cui è necessario.

+0

use_data è ora deprecato – jzadra

+1

@jzadra no biggie è appena stato spostato nel pacchetto ** usethis ** come 'usethis :: use_data' –

11

c'era un recent discussion su questo argomento (nel contesto dello sviluppo del pacchetto) su R-devel, numerosi punti di quali sono relative a questa domanda:

  1. Se solo le opzioni forniti sono applicabili a il vostro esempio R se stesso (cioè, Brian Ripley) ti dice di fare:

    foo <- function(x){ 
        data("dataset_in_question") 
    } 
    
  2. Questo approccio però gettare una nota in controllo R CMD che può essere evitato nelle prossime versioni di R (o attualmente R devel) utilizzando t egli globalVariables() funzione, added by John Chambers

  3. L'approccio 'corretto' (vale a dire, quella sostenuta da Brian Ripley e Peter Dalgaard) sarebbe quella di utilizzare l'opzione LazyData per il pacchetto. Vedi this section of "Writing R Extensions".

Btw: Non capisco perfettamente come dovrebbe funzionare il primo approccio. Cosa dovrebbe fare x <- dataset_in_question? dataset_in_question è una variabile globale o definita in precedenza?

1

per me è stato necessario utilizzare get() in aggiunta a LazyData: true in DESCRIPTION file (vedere postig da @Henrik punto 3) per sbarazzarsi della nota no visible binding for global variable .... La mia versione R è 3.2.3.

foo <- function(x){ 
    get("dataset_in_question") 
} 

Così LazyData rende dataset_in_question direttamente accessibili (senza l'utilizzo di data("dataset_in_question", envir = environment())) e get() è quello di soddisfare R CMD check

HTH

Problemi correlati