3

パッケージに含めたい動的に生成された関数があります (興味がある場合は、下部のスポイラー ブロックで説明されている理由によります)。サポートされていない機能を使用せずに、パフォーマンスの低下を最小限に抑えたいと考えています。私がこれまでに考えた方法は、関数を生成するコードを に入れ、その関数を に.onLoad()格納するかoptions()、隠しオブジェクトとしてに格納すること.GlobalEnvです。意図せずに変更または削除される可能性があるため、関数を に保存することは明らかに.GlobalEnv危険です。それはoptions()あまりにも起こる可能性があり、偶然ではありません。

生成された関数を保存するoptions()のは最善の方法ですか?

私は多変量関数を持っていますFn。長くて醜い導関数で呼び出します。その関数の勾配 (つまり、特定の X で評価される各変数の一次導関数のベクトル) とヘッセ行列 (つまり、特定の X で評価される変数の各組み合わせの二次導関数の行列) を返す別の関数を作成したいと思います。バツ)。コードを保守しやすくするために、元の式を未評価の式として手作業でコード化し、残りの作業を , ,にFn任せます。最終的には、必要な結果を返す動的に生成された関数オブジェクトになります。D()eval()`body<-`()


Adam Hyland のコメントには、この特定の質問に対する最も簡単な答えがあります。回答として投稿すると、受け入れられます。ただし、Richie Cotton の回答は一般的な場合に非常に役立ちますので、よろしくお願いします。

4

1 に答える 1

6

assignInNamespace内部で使用してみることができます.onLoad(テストされていません) が、Adam H がコメントで述べたように、難しい方法で物事を行っているように思えます。

私が質問を正しく理解していれば、導関数の式があり、その式を特定の点で評価し、その点で勾配を計算し、その点でヘシアンを計算したいと考えています。式と評価する座標の数値ベクトルを受け入れる関数を作成し、必要なものをすべて吐き出すだけです。このようなもの:

#' Evaluate an expression, its derivative and its hessian
#' 
#' Evaluates an expression, its derivative and its hessian at a given point.
#' @param expr An expression of derivatives
#' @param x A named numeric vector of coords to evaluate \code{expr} at
#' @param name String giving the name of the variable to differentiate by
#' @return A list with the following values
#' \itemize{
#'   \item{value}{The value of \code{expr} evaluated at \code{x}.}
#'   \item{gradient}{The value of the derivative of \code{expr} evaluated at \code{x}.}
#'   \item{hessian}{The value of the hessian of \code{expr} evaluated at \code{x}.}
#' }
#' @examples
#' expr <- expression(sin(cos(x + y^2)))
#' x <- c(x = pi / 2, y = pi / 3)
#' eval_expr_and_calc_grad_and_hessian(expr, x, "x")
eval_expr_and_calc_grad_and_hessian <- function(expr, x, name = names(x)[1])
{
  x <- as.list(x)
  d_by_dname <- D(expr, name)
  d2_by_dname2 <- D(d_by_dname, name)
  list(
    value    = eval(expr, x),
    gradient = eval(d_by_dname, x),
    hessian  = eval(d2_by_dname2, x)
  )
}
于 2013-06-07T14:40:33.117 に答える