存在しない変数を関数に渡してしまうというかなり複雑な状況があります。これがいつ発生するかはよくわかっていますが、修正するのは難しいでしょう。状態を確実に検出でき、その場合の回避策を実行できれば満足です。私は単に使用することができます
inherits(try(eval(possibly_missing_variable),silent=TRUE),"try-error")
しかし、可能であれば、エラーにつながる特定の条件をテストしたいと思いますobject 'possibly_missing_variable' not found
。(エラー メッセージの "not found" を grep しようとすることもできますが、過去に r-devel リストで、R が別の言語で実行されている場合、これは失敗するので、翻訳されたバージョンのエラーメッセージが表示されます。)
のさまざまな組み合わせを試しましdeparse(substitute(...))
たが、コール スタックで十分に実行されていないようです。再現可能な例での私のベストショットは次のとおりです。
f <- function(d) {
## test here
cat("'d' exists:",exists("d"),"\n") ## TRUE
cat("deparse(substitute(d)):",dd <- deparse(substitute(d)),"\n") ## OK
cat("exists('",dd,"'): ",exists(dd),"\n",sep="")
eval(d)
}
f2 <- function(ddd) {
f(ddd)
}
ddd <- 5
f2(junk)
結果は次のとおりです。
'd' exists: TRUE
deparse(substitute(d)): ddd
exists('ddd'): TRUE
Error in eval(d) : object 'junk' not found
関連するオブジェクトが環境のスタック/囲んでいる環境などのどこにも見つからないため、評価が失敗することを (エラーが発生する前に) 正しく通知するテストが必要です。
より一般的には、引数の最も上流の名前を把握する方法はありますか ("junk"
この場合)? それができればexists(farthest_upstream_name)
、私の問題は解決します。