一开始你的问题似乎有点含糊(尽管我们后来确实提供了更多细节)。有一个deriv 函数允许简单的符号区分。由于您一开始没有提供任何数据,因此在第二条评论之前,我认为您想要象征性的结果。
ex <- expression( x^2*y, 5*x+sin(y) )
sapply(ex, deriv, c("x", "y") )
#-------result--------------------
expression({
.expr1 <- x^2
.value <- .expr1 * y
.grad <- array(0, c(length(.value), 2L), list(NULL, c("x",
"y")))
.grad[, "x"] <- 2 * x * y
.grad[, "y"] <- .expr1
attr(.value, "gradient") <- .grad
.value
}, {
.value <- 5 * x + sin(y)
.grad <- array(0, c(length(.value), 2L), list(NULL, c("x",
"y")))
.grad[, "x"] <- 5
.grad[, "y"] <- cos(y)
attr(.value, "gradient") <- .grad
.value
})
您也可以使用它,它会返回一个函数列表:
sapply(ex, deriv, c("x", "y") , func=TRUE)
[编辑 1:回答第一条评论] 如果您希望对象允许单个矩阵函数,请尝试以下操作:
res <- sapply(ex, function(ex1) lapply(c("x","y") ,
function(arg) deriv(ex1, arg, func=TRUE) ) )
#--------------
> res[1,1]
[[1]]
function (x)
{
.value <- x^2 * y
.grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
.grad[, "x"] <- 2 * x * y
attr(.value, "gradient") <- .grad
.value
}
或者对于表达式版本:
res <- sapply(ex, function(ex1) lapply(c("x","y") ,
function(arg) deriv(ex1, arg) ) )
#----------------------
> res[1,1]
[[1]]
expression({
.value <- x^2 * y
.grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
.grad[, "x"] <- 2 * x * y
attr(.value, "gradient") <- .grad
.value
})
[编辑 2:回答第二条评论] 要评估表达式,请将其传递给具有适当环境的 eval:
> eval( res[1,1][[1]], envir=list(x=4,y=5) )
[1] 80
attr(,"gradient")
x
[1,] 40
需要先使用“[”然后使用“[[”来提取矩阵中列表项的第一个(也是唯一一个)元素,这是一个琐碎的问题。