2017-08-10 9 views
0

それでは、私は一連のファイルを読み込むには、以下の機能を定義したとしましょう:関数内の中間処理ステップを表すための適切な表記法は何ですか?

read_File <- function(file){ 
    # read Excel file 
    df1 <- read.xls(file,sheet=1, pattern="Name", header=T, na.strings=("##"), stringsAsFactors=F) 
    # remove rows where Name is empty 
    df2 <- df1[-which(df1$Name==""),] 
    # remove rows where "Name" is repeated 
    df3 <- df2[-which(df2$Name=="Name"),] 
    # remove all empty columns (anything with an auto-generated colname) 
    df4 <- df3[, -grep("X\\.{0,1}\\d*$", colnames(df3))] 
    row.names(df4) <- NULL 
    df4$FileName <- file 
    return(df4) 
} 

それは、このような正常に動作しますが、それは中間ステップを表すためにdf1...df4を定義するために、悪いフォームのように感じています。読みやすさを損なうことなくこれを行うためのより良い方法はありますか?

答えて

3

複数回使用する必要がない限り、中間オブジェクトを別々に保存する理由はありません。これはあなたのコードではそうではありませんので、私はdfですべてのあなたのdf[0-9]を置き換えます:

read_File <- function(file){ 
    # read Excel file 
    df <- read.xls(file,sheet = 1, pattern = "Name", header = T, 
        na.strings = ("##"), stringsAsFactors = F) 
    # remove rows where Name is empty 
    df <- df[-which(df$Name == ""), ] 
    # remove rows where "Name" is repeated 
    df <- df[-which(df$Name == "Name"), ] 
    # remove all empty columns (anything with an auto-generated colname) 
    df <- df[, -grep("X\\.{0,1}\\d*$", colnames(df))] 
    row.names(df) <- NULL 
    df$FileName <- file 
    return(df) 
} 

df3は素敵なわかりやすい変数名ではありません - それはあなたが、その後df変数の詳細は何も教えてくれありません。途中で新しいステップを追加する必要がある場合は、一貫性を維持するために後続のすべてのオブジェクトの名前を変更する必要があります。 (または、df2.5のようなハッキーなものがありますが、これは醜いものであり、よく一般化しません。)一般的には、sequentially named variables are almost always bad practice, even when they are separate objects that you need savedと思います。

さらに、中間オブジェクトを保持することは、メモリをうまく使用することではありません。ほとんどの場合、重要ではありませんが、データが中間ステップをすべて個別に保存するよりも大きい場合は、処理中に使用されるメモリの量が大幅に増加します。

コメントは非常に優れています。コード内で何が起こっているのか知る必要があることを説明しています。省略するbad_namesベクトルがラインを節約し、よりパラメトリックで持つ

read_File <- function(file){ 
    # read Excel file 
    df <- read.xls(file,sheet = 1, pattern = "Name", header = T, 
        na.strings = ("##"), stringsAsFactors = F) 
    # remove rows where Name is bad: 
    bad_names <- c("", "Name") 
    df <- df[-which(df$Name %in% bad_names), ] 

    # remove all empty columns (anything with an auto-generated colname) 
    df <- df[, -grep("X\\.{0,1}\\d*$", colnames(df))] 
    row.names(df) <- NULL 
    df$FileName <- file 
    return(df) 
} 

- にbad_namesを促進するために些細なことになります。それが私だったら

することは、私はおそらく、このようなものをいくつかのステップを組み合わせることでしょう(おそらくデフォルト値c("", "Name"))を使用して、ユーザーがカスタマイズできるようにします。

+1

同意。これは非常に素晴らしいコードであり、余分な変数は必要ありません。私はコードを開発しているときに変数名に 'temp'や' junk'を使う傾向がありますが、時々私を悩ますように戻ってきます。 – Kevin

関連する問題