2013-03-12 57 views
0

我試圖自動化一些圖形,而不訴諸傳統的循環。我很難弄清楚如何將一行數據框的元素作爲函數的參數傳遞。該函數的樣子:使用數據幀行作爲函數的爭論

makeline <- function(df, var, date, ylab="",xlab="", title="", nbershade=TRUE) { 
p <- ggplot(df, aes_string(x=date, y=var)) 
p <- p + geom_line() 

# do some other magical things 
} 

可以說我有一個數據幀與行如下:

row1 <- c("corn","Price","Date") 

由於玉米是一個數據幀ggplot哽咽它作爲一個字符。然後我用玉米不帶引號和,因爲它是與列名「價格」和「日期」一個數據幀,我認爲這會工作:

mapply(makeline,row1[1],row1[2],row1[3]) 

無論如何,我摸索試圖找出有效地使用這個新功能,而不會導致在列表中循環。任何指針讚賞。

+0

你能顯示'str(df)'還是'head(df)'?我無法理解「玉米」是一個數據框和一行的一部分...... – alexwhan 2013-03-12 04:24:48

+0

如下所示添加'df < - get(df)'使我正確餵食row1時,玉米被「 」。接下來要弄清楚如何傳遞數據框。 – tjbrooks 2013-03-12 14:34:13

回答

1

我不知道我會推薦這作爲一種策略,但可以使用get得到data.frame

makeline <- function(df, var, date, ylab="",xlab="", title="", nbershade=TRUE) { 
    df <- get(df) 
    p <- ggplot(df, aes_string(x=date, y=var)) 
    p <- p + geom_line() 

# do some other magical things 
} 

您可能需要調整環境爲get一貫工作,但它有inherits = TRUE它照顧的大部分東西

data(mtcars) 
data(diamonds) 

Map(makeline, df = c('mtcars','diamonds'), var = c('cyl','x'), date = c('mpg','y')) 
+0

謝謝。這工作。如果我 - 和你一樣 - 直接傳遞字符向量,並且使用'get'函數作爲我想要的df。我甚至可以在'mapply'之外創建和命名字符向量,但是如果字符向量在數據框中綁定在一起,我似乎不能通過引用colname來傳遞向量。例如: – tjbrooks 2013-03-12 14:38:46

+0

'data2 < - data.frame(rbind(as.character(row1),as.character(row2)),stringsAsFactors = FALSE)其中'row2'是與上面類似的行向量。然後'mapply(makeline,data2 $ X1,data2 $ X2,data2 $ x3)'不能很好地工作。很明顯,它們是數據框放在一起的方式,或者我試圖調用col向量的方式。我得到的錯誤是:mapply中的錯誤(makeline,data2 $ X1,data2 $ X2,data2 $ x3): 零長度輸入不能與非零長度輸入混合 – tjbrooks 2013-03-12 14:42:14

+0

@tjbrooks,它看起來像你有你的列名中有一個輸入錯誤,'data2 $ x3'應該是'data2 $ X3'。如果你使用'mapply',你將需要'SIMPLIFY = FALSE',這就是爲什麼我使用'Map',它是'mapply(...,SIMPLIFY = FALSE)的簡單包裝器' – mnel 2013-03-12 22:15:02

0

試試這個

mapply(makeline,get(row1[,1]),row1[,2],row1[,3])