2

deriv() で使用する式を作成しようとしています。非常に長いので、パーツに分割したいと思います(各パーツにはサブパーツがあります)が、これを行う方法がわかりません。as.formula()、expression()、eval()、paste() などのさまざまな組み合わせを試しましたが、うまくいきません。私はそれが次のようなものになることを望みます(動作しない例):

chunk1a <- a + b^2/c
chunk1b <- 4*c - a^2
chunk1 <- chunk1a^2 + 4*chunk1b

chunk2a <- 3*a
chunk2b <- a*b*c^2
chunk2 <- 7*chunk2b/chunk2a

chunk3a <- 5*b*c/a
chunk3b <- b^4 + 5*c
chunk3 <- 4*chunk3a - 1/chunk3b

myderiv <- deriv(~ chunk1 + chunk2/chunk3, 
                 c('a', 'b', 'c'))
4

3 に答える 3

3

文字列と文字列操作 (@Justin の回答のように) の代わりに、引用符で囲まれた呼び出しと言語操作を使用します。

chunk1a <- quote(a + b^2/c)
chunk1b <- quote(4 * c - a^a)

substitute((a) ^ 2 + (b) * 4, list(a = chunk1a, b = chunk1b))

# OR
bquote(.(chunk1a) ^ 2 + .(chunk1b) * 4)

詳細については、https://github.com/hadley/devtools/wiki/Computing-on-the-languageをご覧ください。

于 2013-01-31T12:37:34.510 に答える
1

予期しないエッジケースがあると思いますが、次のようにすることができます:

chunk1a <- 'a + b^2/c'
chunk1b <- '4 * c - a^a'

chunk1 <- paste('(', chunk1a, ')^2 +', chunk1b, '* 4')

eval parseそれからあなたは常に恐ろしい土地に入ります:

a <- 1
b <- 2
c <- 3

eval(parse(text=chunk1))
# [1] 13.44444

derivなしでドロップすることもできますeval

deriv(parse(text=chunk1), c('a', 'b', 'c'))
# expression({
#     .expr1 <- b^2
#     .expr3 <- a + .expr1/c
#     .expr7 <- a^a
#     .value <- .expr3^2 + 4 * c - .expr7 * 4
#     .grad <- array(0, c(length(.value), 3L), list(NULL, c("a", 
#         "b", "c")))
#     .grad[, "a"] <- 2 * .expr3 - (a^(a - 1) * a + .expr7 * log(a)) * 
#         4
#     .grad[, "b"] <- 2 * (2 * b/c * .expr3)
#     .grad[, "c"] <- 4 - 2 * (.expr1/c^2 * .expr3)
#     attr(.value, "gradient") <- .grad
#     .value
# })

面倒な作業を行う関数を作成することもできます。

myfun <- function(expr_string1, wrapper1=NULL, expr_string2=NULL, wrapper2=NULL, join_fun=NULL) {
  if (!is.null(wrapper1)) {
    expr_string1 <- paste('(', expr_string1, ')', wrapper1)
  }

  if (!is.null(wrapper2)) {
    expr_string2 <- paste('(', expr_string2, ')', wrapper2)
  }

  if (!is.null(expr_string2) & !is.null(join_fun)) {
    expr_string1 <- paste(expr_string1, join_fun, expr_string2)
  }

  return (expr_string1)
}

そしてそれを呼び出します:

deriv(parse(text=myfun(chunk1a, '^2', chunk1b, '*4', '+')), 
            c('a', 'b', 'c'))

うん…

于 2013-01-30T23:52:50.760 に答える
1

これを試して:

library(Ryacas)

a <- Sym("a")
b <- Sym("b")
c <- Sym("c")

chunk1a <- a + b^2/c
chunk1b <- 4*c - a^2
chunk1 <- chunk1a^2 + 4*chunk1b

chunk2a <- 3*a
chunk2b <- a*b*c^2
chunk2 <- 7*chunk2b/chunk2a

chunk3a <- 5*b*c/a
chunk3b <- b^4 + 5*c
chunk3 <- 4*chunk3a - 1/chunk3b

deriv(deriv(deriv(chunk1 + chunk2/chunk3, a), b), c)
于 2013-01-31T00:23:51.520 に答える