当函数的输出是简单表达式(例如单个数字)时,我熟悉使用函数curve
在R中绘制函数。我们如何处理输出更复杂的函数,例如列表?
让自己清楚的一个例子。假设我有以下功能。
f <- function(a,b,c,d){
check <- a
prob <- c:d
n <- c*2
r <- d-b
lista <- list(check,prob,n,r)
names(lista) <- c("check", "prob", "n", "r")
return(lista)
}
f <- Vectorize(f, vectorize.args = "a")
如何使用函数curve
绘制输出列表中某个元素的结果,例如n
,作为a
的函数?如果我将返回值设置为n
,则此操作非常顺利,但如果我想将当前列表输出保留用于其他目的,该怎么办?
我已经检查了?curve
,并且相当令人沮丧地说明了
对于昂贵的计算表达式,您应该使用更智能的工具
不要认为这是适用的情况,但实际上,正如帮助页面所暗示的那样,&#34; curve
处理expr
的方式导致混淆&#34; 。
一种天真的方法是打电话
curve(f(x, b= 2, c= 3, d=1)$n)
但这似乎并没有完成这项工作。任何解决方案,无需更改功能输出或必须使用&#34; ggplot&#34;排序?
答案 0 :(得分:0)
你应该在矢量化之前提取元素。也就是说,
f <- function(a,b,c,d){
check <- a
prob <- c:d
n <- c*2
r <- d-b
lista <- list(check,prob,n,r)
names(lista) <- c("check", "prob", "n", "r")
return(lista)
}
fn <- Vectorize(function(x) f(x, b= 2, c= 3, d=1)$n)
curve(fn)
如果你真的想使用f
的原始矢量化版本,那么你需要意识到结果取决于你的函数的结果,而不仅仅是数据框或列表。在您的情况下,它是一个包含4行的列表模式矩阵。所以你可以使用
f <- function(a,b,c,d){
check <- a
prob <- c:d
n <- c*2
r <- d-b
lista <- list(check,prob,n,r)
names(lista) <- c("check", "prob", "n", "r")
return(lista)
}
f <- Vectorize(f, vectorize.args = "a")
curve((function(a) unlist(f(a, b=2, c=3, d=1)["n",]))(x))
或
fn <- function(a) unlist(f(a, b=2, c=3, d=1)["n",])
curve(fn)
(并且可能有其他表达方式可行),但是真的值得搞清楚吗?