論理の流刑地

地獄の底を、爆笑しながら闊歩する

RのプログラムをMacからWindowsに移行する時に使うコード

備忘 of 備忘 of 備忘

Motivation

ちょっと色々あってMacからWindowsに乗り換えることになり(8年振りくらい)、
自分で作った関数や色々な分析の記録も含めRのコードをそのまま新しい環境にうつした。
基本的にはOSに依存しないで動くものであるので、あまり考えるところはない。

しかし、置かれるディレクトリの場所がどうしても変わってしまい、source("")やload("")などのdirectoryの指定先が変わるので、そこに関しては一括で書き換えなくてはいけない。
具体的には、Macだと

source("/Users/Name1/xxx.R")

となっていたのを、Windowsでは

source("C:/Users/Name2/yyy/xxx.R")

みたいに該当のフォルダにかえなくてはならない。

この処理が単純そうに見えて意外と思いつかなかったのでメモしておく。

Implementation


How to read txt file and replace word in R? - Stack Overflow
↑このURLを参考にした。

ファイルのパスの一覧の取得

まず、Rのファイル一式のパスを取得する。
自分はRのコードファイルの拡張子を「.R」にしているので、それを正規表現で拾ってきている。

dir_tgt <- list.files( "C:/Users/Name1/Documents/R/", pattern = ".*\\.R" , recursive =T , include.dirs=F)
dir_list <- paste0( "C:/Users/Name1/Documents/R/" , dir_tgt)

recursive=Tで配下のディレクトリまで探知範囲にすることを、include.dirs=Fでフォルダのパスは取得しないことを指示している。
二行目では後々のためにフルパスにしている。

つぎに、中身を一括で書き換えるための関数をつくる

中身を書き換える関数を実装する

ファイルのパスを指定すれば、load()やsource()で使われている中身のディレクトリを書き換えてくれる関数をつくる

reToWin <- function(tdir){
old_txt <- readLines( tdir , encoding = "UTF-8")
new_txt <- gsub("/Users/Name2/Documents/" , "C:/Users/Name1/Documents/", x = old_txt)
writeLines(new_txt , con = tdir , useBytes=T)
} #function

readLines()のほうのencoding = "UTF-8"と、writeLines()のuseBytes=Tをいれないと自分の環境では文字化けした。
多くのMacWindowsの移行でも一緒だと思う(たぶん)

作った関数で一括して変更する

for( i in seq_along( dir_list)){
reToWin(dir_list[i])
} #for


終わり!わかれば簡単。

あとはMac環境でsave()したものをWindowsでload()すると文字化けするみたいな問題もあるが、
それはその度にiconv()とかで対応していくしかないかなぁ....


Def Tech - Catch The Wave