複数回使用する必要がない限り、中間オブジェクトを別々に保存する理由はありません。これはあなたのコードではそうではありませんので、私は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")
)を使用して、ユーザーがカスタマイズできるようにします。
同意。これは非常に素晴らしいコードであり、余分な変数は必要ありません。私はコードを開発しているときに変数名に 'temp'や' junk'を使う傾向がありますが、時々私を悩ますように戻ってきます。 – Kevin