2015-08-07 15 views
5

Firma, w której pracuję, wykonuje analizę ELISA przez cały czas (test immunologiczny), a więc programuję funkcję, która pobiera wersję formatu csv odczytu maszyny gęstości optyczne i uruchamia regresję statystyczną zwaną analizą 4PL. Zasadniczo jest to funkcja 4pl for dummies, która korzysta z pakietu drc. Mam większość kodu napisanego, ale teraz próbuję faktycznie umieścić go w formacie funkcji (działa dobrze poza strukturą funkcji).User-Function, zdefiniowany obiekt formalny, ale nie znaleziony przez kod

Oto mój problem. Ja definiowania Formals() z mojej funkcji tak:

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

To nie jest szczególnie ważne, co inni formale są w tej chwili, ale jestem z systemem do dwóch problemów. Oto kod pierwszej części bloku.

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

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

Jeśli społeczność w swojej mądrości myśli, że muszę uwzględnić więcej, zrobię to, ale zostawmy to na razie.

Problem:

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

Ten błąd pojawia się. Jak widać jednak, wd definiuje

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 

Ponadto, jeśli predefine WD jako "~/Desktop" w globalnym środowisku, błąd za wd odchodzi, ale otrzymuję ten

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 

Albo jestem całkowicie zbijając z tego, w jaki sposób definiuję moje formalsy, lub napotykam na bardzo dziwne argumenty przemijające. Jakieś pomysły?

+0

Dlaczego nie uwzględnić ścieżki w argumencie "file'? Ponadto, wątpię, żeby to był problem, który widzisz, ale czy "poziomy" muszą być ciągami znaków? –

+0

Masz rację. Kiedy udało mi się rozwiązać główną kwestię, poziome traktowane jako obiekt, a nie ciąg, było kolejnym błędem zidentyfikowanym :) – Eich

Odpowiedz

6

Problem polega na tym, że usuwasz wszystkie formularze za pomocą pierwszego wiersza, rm(list=ls()).

Na przykład:

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

Podczas definiowania wd w globalnym środowisku (czyli w stosie powyżej swojej funkcji) twoja funkcja będzie działać (przynajmniej do tego momentu), ponieważ rm(list=ls()) usunie tylko zmienne w twoim obecnym środowisku (tj. stos wywoływania funkcji). W takim przypadku twoja funkcja użyje wartości dla zmiennych zdefiniowanych w środowisku globalnym.

+0

Omg, jestem kretynem. Miałem to w kodzie, kiedy szybko wykonywałem iterację, aby debugować, gdy nie była to funkcja, i zapomniałem ją zedrzeć, gdy ją wszystkie razem nawleczono. Byłem tak skoncentrowany na tym, że prawdopodobnie byłam bezpośrednią przyczyną pomiędzy formalsami a poleceniem setwd, że całkowicie zapomniałem sprawdzić interferencję z innych linii. Przepraszam za moją ślepotę bojową. To tylko żenujące. Dziękuję, że jesteś moim drugim zestawem oczu. – Eich

Powiązane problemy