当函数输出为列表时使用R函数曲线

问题描述 投票:0回答:1

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

如何使用functioncurve绘制输出列表中某个元素的结果,例如n,作为a的函数?如果我将返回设置为onlyn,这非常顺利,但如果我想将当前列表输出保留用于其他目的,该怎么办?

我检查了?curve,它表示相当令人沮丧

对于昂贵的计算表达式,您应该使用更智能的工具

不要认为这是适用的情况,但实际上,正如帮助页面所暗示的那样,“waycurve处理expr会造成混乱”。

一个天真的方法是打电话

curve(f(x, b= 2, c= 3, d=1)$n)

但这似乎没有做到这一点。任何解决方案,无需更改功能输出或必须使用“ggplot”和排序?

r function plot
1个回答
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)

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

© www.soinside.com 2019 - 2024. All rights reserved.