2012-03-12 16 views
9

Zastanawiałem się, czy ktoś może mi pomóc użyć zmiennej nazwy w funkcji. Sporządziłem wykres kropkowy, który sortuje zmienne, a następnie tworzy bitmapę, ale nie mogę uzyskać R przekazania nazwy zmiennej do tytułu plot.Przekaż nazwę zmiennej do funkcji funkcji plotowania

Przykładowe dane

id<-c(1,2,3) 
blood<-c(1,2,10) 
weight<-c(1,2,13) 


mydata<-as.data.frame(cbind(id,blood,weight)) 
mydata$blood 

#######SORTED DOT PLOT#### 


Dplotter<-function (id,x,Title=""){ 
if (is.null(Title)) {Title=""} else {Title=Title} 

DIR<-paste("C:/temp/WholePlots/New/",Title,".bmp",sep="") 

D<-as.data.frame(cbind(id,x)) 
x1<-as.data.frame(D[order(x),]) 

bmp(DIR) 
dotchart(x1$x,labels=id,main=Title,pch=16) 
dev.off() 
} 


############### 
Dplotter(mydata$id,mydata$blood,"Blood") 

Dplotter(mydata$id,mydata$weight,"Weight") 
  1. W drugim wierszu funkcji, chciałbym przekazać zmiennej nazwy, coś jak

    `if (is.null(Title)) {Title=varname(x)} else {Title=Title}` 
    

    tak, że don” Trzeba umieścić "Krew" w funkcji Pole tytułu (np. Dplotter (mydata $ id, mydata $ blood)

    Zasadniczo, w jaki sposób wkleja się nazwę zmiennej w funkcji? To byłoby jeszcze lepsze, gdyby można było pobrać nazwę zestawu danych z tytułu (bez dołączania zestawu danych, co do którego powiedziano mi, że jest zła praktyka ), więc zamiast uzyskać mydata$blood, otrzymujesz po prostu "krew" w tytule.

    Nie udało mi się znaleźć prostego rozwiązania do wklejenia w nazwie zmiennej w funkcji. Jak można się domyślić, umieszczenie nazwy zmiennej w funkcji powoduje zwrócenie wartości zmiennej (tak, że tytuł fabuły jest wypełniony wartościami, a nie nazwą zmiennej).

  2. Chciałbym również zautomatyzować funkcję jeszcze bardziej, tak że mogę wystarczy umieścić zestaw danych oraz identyfikator, a następnie mieć funkcję powtarzane dla każdej zmiennej w zbiorze danych. Oczywiście wymaga to najpierw rozwiązania pytaniapierwsze, w przeciwnym razie zarówno tytuł, jak i nazwy plików napotkają problemy z .

Odpowiedz

13

Ogólna odpowiedź to deparse(substitute(x)). Na przykład.

fooPlot <- function(x, main, ...) { 
    if(missing(main)) 
     main <- deparse(substitute(x)) 
    plot(x, main = main, ...) 
} 

Oto ona w użytku:

set.seed(42) 
dat <- data.frame(x = rnorm(1:10), y = rnorm(1:10)) 
fooPlot(dat, col = "red") 

która produkuje:

using <code>deparse(substitute())</code> to title a plot

W danym przykładzie jednak, to nie będzie działać, ponieważ nie chcesz dat$x jako tytuł, chcesz tylko x. Mogliśmy zrobić trochę więcej manipulacji jednakże:

fooPlot <- function(x, main, ...) { 
    if(missing(main)) { 
     main <- deparse(substitute(x)) 
     if(grepl("\\$", main)) { 
      main <- strsplit(main, "\\$")[[1]][2] 
     } 
    } 
    plot(x, main = main, ...) 
} 

który dla fooPlot(dat$x, col = "red") daje:

second attempt

Uwaga Ten kod sprawia, że ​​pewne założenia, że ​​main nie jest wektorem, że nie tylko nigdy nie będzie jeden $ w obiekcie przekazanym do wykresu (tzn. nie można użyć listy zagnieżdżonej, na przykład z powyższym kodem).

+0

Dziękuję bardzo. Działa bardzo dobrze. Czy ktoś ma jakieś sugestie, jak zrobić 2 (pytanie 2, patrz wyżej). Na przykład, spraw, aby wykres foo działał w ramach innej funkcji "Plotall", która przesyła wszystkie zmienne zestawu danych jeden po drugim do wykresu foo? To pozwoliłoby mi napisać ## PlotAll (id, mydata) i uzyskać wszystkie wydrukowane wykresy. Wielkie dzięki –

1

Musisz pobrać zestaw ciągów znaków, nazwy zmiennych i użyć ich również dla tytułu swoich działek i nazw plików.

Użyję długiego zestawu danych do zilustrowania podstępu.

data(longley, package="datasets") 

#return a vector with variable names 
colnames(longley) 
names(longley) #equivalent 

#get the name of a specific variable (column number): 
names(longley)[1] 

Aby wykreślić każdej zmiennej, uzyskać dwa zestawy strun: Zmienna nazwisk i nazw:

var.names=names(longley) 
file.names=paste(var.names, "bmp", sep=".") 
#with an extra step to prefix a directory to those filenames 

for (i in 1:ncol(longley)) { 

    bmp(file=file.names[i]) 
    plot(longley[[i]], main=var.names[i], ylab="") 
    dev.off() 
} 

ylab = "", gdyż w przeciwnym razie daje głupie "Longley [[i]]", jak y-label, a jeśli użyję var.name [i] jako ylab, będzie to zbyteczne.

+0

Drogi p_barill, dokładnie tego potrzebowałem. Dziękuję bardzo za Twoją pomoc. –

Powiązane problemy