当函数输出为列表

时间:2018-01-01 10:34:24

标签: r function plot

当函数的输出是简单表达式(例如单个数字)时,我熟悉使用函数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;排序?

1 个答案:

答案 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)

(并且可能有其他表达方式可行),但是真的值得搞清楚吗?