関数のように、呼び出し元の名前を取得する「非内部」の方法stop
はありますか?
アイデアは、入力をチェックし、いくつかの条件が満たされない場合に実行を停止する小さな関数を持っているということです。この関数は、同じ検証コードを使用する他のいくつかの関数によって呼び出されます。入力が無効な場合、呼び出し元の環境がダンプされ(関数に渡された引数を確認できるように)、実行が停止します。
簡略化した例:
check <- function(x)
{
if(x<0)
{
print(as.list(parent.frame()))
evalq(stop("invalid input."), parent.frame())
}
}
test <- function(x, y)
{
check(x)
}
quote(stop("blah"))
発信者の環境で式を評価すると、発信者の名前が表示されると思いました。ただし、結果は次のようになります。
test(-1, 2)
# $x
# [1] -1
#
# $y
# [1] 2
#
# Error in eval(substitute(expr), envir, enclos) : invalid input.
そして、で使用parent.frame(n)
してもこれは変わりません。n>1
evalq
ここに質問があります。実際には2つの質問です。1。環境を作成した関数の名前を取得する方法はありますか(そのように作成されたと仮定して)?2.上記の回避策が失敗するのはなぜですか?
編集:エラーメッセージを次のように表示したかったので、上記の回避策は失敗すると言いました
Error in test(x, y) : invalid input.
まるでstop
声明がtest
身体の一部であるかのように。したがって、質問2は次のように言い換えることができます。2':stop("invalid input.")
発信者の環境で評価されたと考えて、発信者の名前をキャプチャする評価が行われなかったのはなぜですか。