2013-03-12 3 views
0

Я пытаюсь автоматизировать некоторые графики, не прибегая к традиционным циклам. Мне трудно понять, как передать элементы строки dataframe в качестве аргументов функции. Функция выглядит следующим образом:Использование строк данных в качестве аргументов функции

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 
} 

Допустим, у меня есть dataframe с рядом следующим образом:

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

Поскольку кукуруза является dataframe ggplot душил на ней как персонаж. Тогда я использовал кукурузу без кавычек и так как это dataframe с именами столбцов «Цена» и «Дата», я думал, что это будет работать:

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

Во всяком случае, я шарить пытается выяснить, эффективно использовать этот новая функция, не приводя к циклическому переходу по спискам. Любые указатели оценили.

+0

Вы можете показать 'str (df)' или 'head (df)'? Я не могу понять, как «кукуруза» является фреймворком данных и частью строки ... – alexwhan

+0

добавление 'df <- get (df)', как показано ниже, дает мне правильную информацию при подаче строки1 с кукурузой, ». Далее вы узнаете, как передать данные. – tjbrooks

ответ

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', однако я, похоже, не могу передать векторы, ссылаясь на имена кодов, если векторы символов связаны друг с другом в кадре данных. Например: – tjbrooks

+0

'data2 <- data.frame (rbind (as.character (row1), as.character (row2)), strAsAsFactors = FALSE)' где 'row2' - аналогичный вектор строки, как указано выше. Тогда 'mapply (makeline, data2 $ X1, data2 $ X2, data2 $ x3)' не работает так хорошо. Понятно, что это какая-то проблема в том, как скомпилирован файл данных, или как я пытаюсь вызвать col-векторы. Ошибка, которую я получаю: «Ошибка в mapply (makeline, data2 $ X1, data2 $ X2, data2 $ x3): Вводы нулевой длины нельзя смешивать с ненулевыми значениями длины – tjbrooks

+0

@tjbrooks, похоже, что у вас есть опечатка в именах столбцов, 'data2 $ x3' должна быть' data2 $ X3'. Если вы используете 'mapply', вам нужно будет' SIMPLIFY = FALSE', поэтому я использовал «Map», который является простой оболочкой для 'mapply (..., SIMPLIFY = FALSE)' – mnel

0

попробовать это

mapply(makeline,get(row1[,1]),row1[,2],row1[,3]) 
Смежные вопросы