【问题标题】:Using R function curve when function output is a list函数输出为列表时使用 R 函数曲线
【发布时间】:2018-01-01 10:34:24
【问题描述】:

当函数的输出是一个简单的表达式(例如单个数字)时,我熟悉使用函数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 的函数?如果我将返回设置为 onlyn,这将非常顺利,但如果我想保留当前列表输出用于其他目的怎么办?

我检查了?curve,它指出,相当令人沮丧的是,

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

不要认为这是适用的情况,但实际上,正如帮助页面所建议的那样,“方式curvehandlesexpr已经引起了混乱”。

一种天真的方法是调用

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

但这似乎并没有起到作用。无需更改函数输出或不必使用“ggplot”和排序的任何解决方案?

【问题讨论】:

  • 你有什么理由不使用plotcurve 只是 plot 的包装,所以看不出为什么要坚持使用 curve。例如,只需一个简单的plot(x,f(x, b= 2, c= 3, d=1)$n,ty="l") 即可让您接近使用curve 获得的图。
  • @nicola 我想这样做,而不必指定传递给函数的可能值的向量。我提供的例子是一个假人;我正在使用的真正功能要复杂得多。这是一个阶跃函数,我不知道它跳到哪里。另外,我很想揭开curve的奥秘
  • curve() 采用参数方式。如果 ggplot2 采用原始 JSON 并在不指定 geoms 的情况下为我制作神奇的情节,我会很高兴,但这不会发生。 curve0 奥秘。在 R 控制台输入 curve,按 Enter。您的问题不完整,因为您从未向我们提供x 的向量。
  • @Easymode44 阅读文档以了解如何计算点数。它们只是seq(from,to,length.out=n),其中fromton 是您传递给curve 的参数。如果您不传递这些值,from=0to=1n=101(除非您正在绘制现有地块)。所以只需使用plot
  • @hrbrmstr 我会听从您的建议并深入阅读curve(尽管我希望从 Stackoverflow 获得更深入的提示 - 注意详细说明“参数方面”)。我不需要指定x。如果把函数中的return改成return(n),我就可以顺利使用curve,以x为横坐标。

标签: r function plot


【解决方案1】:

您应该在矢量化之前提取元素。也就是说,

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)

(可能还有其他可以使用的表达式),但真的值得弄清楚这一点吗?

【讨论】:

  • 谢谢您,好心的先生,您的回答。我想这是值得的,因为我真正掌握了curve 的工作原理。
猜你喜欢
  • 2022-11-15
  • 2015-03-01
  • 2015-04-26
  • 2012-02-21
  • 1970-01-01
  • 2023-01-04
  • 2016-07-22
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多