【问题标题】:In R, can I change histogram title without specify `main=`?在 R 中,我可以在不指定 `main=` 的情况下更改直方图标题吗?
【发布时间】:2017-07-15 09:05:36
【问题描述】:

好的,假设我用我的函数创建了一个非常简单的直方图:

hist(my.fun(100))

我的直方图标题显示Histogram of my.fun(100)。这对我来说非常好!我喜欢 R 自动识别my.fun(100) 并将其放在标题和标签中的方式。

然后我做了复杂的计算,说:

n <- my.complex.algo.that.compute.size(args)
hist(my.fun(n))

这一次,标题显示Histogram of my.fun(n)。这不知道n 有多大。我知道n 将被评估为某个整数,假设对于这次运行n == 42,我希望看到直方图的标题显示Histogram of my.fun(42)

这可能没有我自己指定标题(没有main=paste(...))。我已经尝试过这些并失败了:

hist(my.fun(`n`))
hist(my.fun(eval(n)))

【问题讨论】:

  • “我如何在 R 中做某事而不使用提供的参数来做到这一点?”是一个很奇怪的问题。显然你的尝试失败了。在hist 的帮助页面上,它说您使用参数main 更改标题。如果你不喜欢这样,你可以编写你自己的 hist 函数来做你想做的事情。
  • 如果你解释一下为什么我们可能不会那么困惑?特别是“(no main=paste(...))”,为什么?
  • 我发现 R 有非常奇怪的评估方面(与其他通用语言如 C、Python 相比)。对于这个,我很好奇为什么 hist() 可以捕捉到表达式 my.fun(100) 并在稍后将其作为标题中的字符串!
  • @neizod 一旦你理解了 R 的评估方面,它们就没什么奇怪的了。 R 来自函数式编程语言的角落,并且与闭包一起使用。如果您查看hist 的源代码,您会立即看到该函数是如何做到这一点的。或者 Spacedman 的回答也向您展示了这一点。
  • 不知道去哪里找hist的源码?有一个question for that。 ;-)

标签: r plot histogram


【解决方案1】:

如果您将直方图限制为单个参数的函数,n,那么您可以这样做:

nhist = function(f,n){
   hist(f(n),
   main=paste0(
     "Histogram of ",
     deparse(substitute(f), 500),"
     (",n,")", collapse = "\n"))}

你的称呼略有不同:

Z=100
nhist(runif, Z)

您必须分别传递fn,因为hist 无法弄清楚传递给f 的内容。

【讨论】:

    【解决方案2】:

    查阅hist源代码后,我可以说hist作为顶级函数调用时这是不可能的。由于源代码中的这一行:

    xname <- paste(deparse(substitute(x), 500), collapse = "\n")
    

    deparse(substitute(x)) 尝试捕获(尚未评估的)表达式树并将其转换为字符串。这意味着无论我输入什么表达式作为 hist 函数的第一个参数,它都会立即变成一个字符串,而无需任何评估。

    为了实现这一点,我需要在表达式树的某个叶子上强制求值。哪个(幸运的是我刚刚了解它)可以使用substitute 完成,并使用do.call 将评估的表达式树作为hist 函数的参数传递:

    n <- my.complex.algo.that.compute.size(user.args)   # suppose this calc return 42
    evaluated.arg <- substitute(my.fun(x), list(x=n))   # now this will be my.fun(42)
    do.call(hist, list(evaluated.arg))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多