2015-08-07 9 views
5

L'azienda per cui lavoro ha sempre un'analisi ELISA (il test del sistema immunitario), quindi sto programmando una funzione che accetta una versione in formato csv della lettura della macchina per le densità ottiche e gestisce una regressione statistica chiamata analisi 4PL. È essenzialmente una funzione 4pl for dummies che fa uso del pacchetto drc. Ho scritto la maggior parte del codice, ma ora sto provando a inserirlo effettivamente in un formato di funzione (funziona benissimo al di fuori della struttura delle funzioni).Funzione utente, oggetto formals definito ma non trovato dal codice

Ecco il mio problema. Sto definendo la formali() della mia funzione in questo modo:

elisa<-function(file="data.csv",wd="~/Desktop",standards=c(1,2),orient=horizontal, 
limit=TRUE,graph.4pl=FALSE,Conc.graph=FALSE){ body of function} 

Non è particolarmente importante quello che gli altri formali sono in questo momento, ma io sono in esecuzione in due problemi. Ecco il codice per la prima parte del blocco.

rm(list=ls()) 
setwd(wd) 
library(drc);library(reshape2);library(ggplot2) 

data<-read.csv(file,head=TRUE, colClasses=c("character")) 

Se la comunità nella sua saggezza pensa ho bisogno di includere più, io voglio, ma cerchiamo di lasciarlo lì per ora.

Il problema:

elisa("Mock data.csv") 
Error in setwd(wd[1]) : object 'wd' not found 

Questo errore si presenta. Come si può vedere, però, WD è definito

formals(elisa) 
$file 
[1] "data.csv" 

$wd 
[1] "~/Desktop" 

$standards 
c(1, 2) 

$orient 
horizontal 

$limit 
[1] TRUE 

$graph.4pl 
[1] FALSE 

$Conc.graph 
[1] FALSE 

Inoltre, se predefinire wd come "~/Desktop" nel contesto globale, l'errore per WD va via, ma ottengo questo

wd<-"~/Desktop" 
elisa("Mock data.csv") 
Error in read.table(file = file, header = header, sep = sep, quote = quote, : 
'file' must be a character string or connection 

O io sono completamente a mio agio su come sto definendo le mie formali, o mi sto imbattendo in argomenti di passaggio molto dispari. Qualche idea?

+0

Perché non includere il percorso nell'argomento 'file'? Inoltre, dubito che sia un problema che stai vedendo, ma 'horizontal' deve essere una stringa di caratteri? –

+0

Hai ragione. Una volta risolto il problema principale, il successivo errore identificato è stato considerato orizzontale come oggetto anziché come stringa :) – Eich

risposta

6

Il problema è che stai cancellando tutte le tue formali con la prima riga, rm(list=ls()).

Ad esempio:

f <- function(a=1) { 
    rm(list=ls()) 
    print(a) 
} 
f() 
## Error in print(a) : object 'a' not found 

Quando si definisce wd nel contesto globale (cioè nello stack sopra la funzione) la funzione funzionerà (almeno fino a quel momento) perché rm(list=ls()) cancellerà solo le variabili all'interno del tuo ambiente corrente (es. lo stack delle chiamate di funzioni). In questo caso, la tua funzione utilizzerà i valori per le variabili definite nell'ambiente globale.

+0

Omg, sono un idiota. Ho avuto questo nel codice quando stavo rapidamente eseguendo il debug quando non era una funzione, e ho dimenticato di strattonarlo quando ho messo tutto insieme. Mi sono così concentrato sul fatto che probabilmente c'è una causa diretta tra le formali e il comando setwd che ho completamente dimenticato di controllare l'interferenza da altre linee. Per favore, scusa la mia cecità da battaglia. Questo è semplicemente imbarazzante. Grazie per essere il mio secondo set di occhi. – Eich

Problemi correlati