2016-03-30 6 views
4

У меня есть функция, которую я хочу расширить с возможностью сохранения результатов в файл csv. Имя файла CSV должен быть сформирован на основе data.frame имя передается этой функции:Как получить имя data.frame из списка, переданного функции, используя lapply

my.func1 <- function(dframe, ...){ 
    # PART OF CODE RESPONSIBLE FOR COMPUTATION 
    # ... 

    # PART OF CODE WHERE I WANT TO STORE RESULTS AS CSV 
    csv <- deparse(substitute(dframe)) 
    csv 
} 

Когда я называю эту функцию следующим образом, то имя набора данных передается этой функции интерпретируется правильно:

> my.func1(mtcars) 
[1] "mtcars" 

Но мне нужно вызвать эту функцию для каждого файла data.frame из списка. Если я называю эту функцию для конкретного data.frame из списка, то она в основном работает (я получаю уродливое имя, содержащее также название списка, но один обходной путь может быть обрезать его, используя регулярное выражение):

> LoDFs <- list(first=data.frame(y1=c(1,2,3), y2=c(4,5,6)), second=data.frame(yA=c(1,2,3), yB=c(4,5,6))) 
> my.func1(LoDFs$first) 
[1] "LoDFs$first" 

Проблема заключается в том, когда Я хочу вызвать эту функцию для всех data.frames из списка. В этом случае имена data.frame являются неразбериха:

> lapply(LoDFs, my.func1) 
$first 
[1] "X[[i]]" 

$second 
[1] "X[[i]]" 

> lapply(seq_along(LoDFs), function(x) { my.func1(LoDFs[[x]]) }) 
[[1]] 
[1] "LoDFs[[x]]" 

[[2]] 
[1] "LoDFs[[x]]" 

Что я делаю неправильно и как я могу избежать упомянутый обходной путь с регулярными выражениями и сделать код более устойчивым?

+1

Последний раз я столкнулся с подобной проблемой, я сдался и сделал вектор имен из data.frames, а затем использовать get() для захвата data.frame. Для вас что-то вроде lapply (имена (LoDFs), my.func1), где первая строка my.funct1 - df <- Lodf [[n]] Надеюсь, у кого-то есть более элегантное решение. –

ответ

3

е каждый кадр данных в списке называется

lapply (names (LoDf),function(i)write.csv (my.fun1 (LoDf [[i]]),paste0 (i,'.csv'))) 

На телефон прости небольшие ошибки

2

Вопрос заключается в том, что lapply не корми имя элемента в списке, это только кормить сам предмет.

Альтернативное решения является использование mapply, который ИМ более конкретная информации о входе, а не полагаться на обзорном

mapply(function(L,N){write.csv(L, paste0(N,".csv"));}, L=LoDFs,N=names(LoDFs)) 
+0

Это хорошая точка –

+0

В этом отношении мы могли бы также использовать sapply ... –

+0

@CarlBoneri могу я спросить, как «mapply» можно заменить на 'sapply'? –