2016-03-30 12 views
4

結果をCSVファイルに保存する機能を拡張したい機能があります。lapplyを使用して関数に渡されたリストからdata.frameの名前を取得する方法

> my.func1(mtcars) 
[1] "mtcars" 
:私は、この関数に渡されたデータセットの名前が正しく解釈されている方法以下、この関数を呼び出すと

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 
} 

:csvファイルの名前は、この関数に渡さ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.frameため、この関数を呼び出した場合、それは基本的に取り組んでいる(私は醜い名前がリストの名前が、1つの回避策は、正規表現を使用して、それをトリミング可能性も含んで取得します)私はリストからすべての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]]" 

私が間違ってやっているとどのように私は、正規表現での回避策に言及し、コードをより堅牢に回避することができますか?リスト内の各データフレームF

+1

前回のスコープに頼るよりも、入力について、より具体的であるmapplyを使用することです、私はあきらめたと名前のベ​​クトルを作りましたdata.frameを取得するためにget()を使用しました。あなたのために、 lapply(名前(LoDFs)、my.func1)のようなものです。ここで、my.funct1の最初の行はdf < - Lodf [[n]] です。 –

答えて

3

は問題がlapplyリスト内の項目の名前を供給していない、それが唯一の餌ということですので、小さなミスを許し

2

電話で

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

命名されましたアイテム自体。

代替ソリューションは、IMOではなく、私は同様の問題に直面しました

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

それは良い点です –

+0

サボテンを使用することもできます。 –

+0

@CarlBoneri私は 'mapply'を' sapply'に置き換えることができますか? –

関連する問題