複雑なコードを書いているときに、どの関数からの呼び出しか
いちいちprintに明記するのが面倒で、動的に関数の名前を取得できたらいいな、というとき用の備忘
つまり、実現したいことは次のようなスクリプトを書たら、f1()
と出す
f1 <- function(){
print(get_tihs_function_name())
}
f1()
これも素直に関数が用意されているわけじゃなさそうだったので、自作しとく。
sys.frames()
と sys.calls()
をうまく使えばいけることがわかった。
なお、REPLでの実行とsourceでの実行で違いがあるので、両方対応するためにはちょっと工夫が必要
get_tihs_function_name <- function(){
tmp_frames <- sys.frames()
tmp_calls <- sys.calls()
function_name_ix <- -1
for(i in seq_along(tmp_frames)){
if(environmentName(tmp_frames[[i]]) == 'R_GlobalEnv'){
function_name_ix <- i + 1
}
}
this_function_name <- ''
# REPLで実行するとR_GlobalEnvにたどり着かないはずだから、REPL実行用に分岐用意しとく
if(function_name_ix >= 0){
this_function_name <- as.character(tmp_calls[[function_name_ix]])
}else{
this_function_name <- as.character(tmp_calls[[1]])
}
this_function_name <- paste0(this_function_name, '()')
return(this_function_name)
}