【问题标题】:r: How to make a function return two plot objects arranged by par()r:如何使函数返回由 par() 排列的两个绘图对象
【发布时间】:2021-05-05 23:44:22
【问题描述】:

所以我是functions 的新手,我正在尝试创建一个简单的function,它返回由par() 排列的两个图,例如

par(mfrow=c(1,2), mar=c(5,5,2,2))
hist(p$vitd,  col='lightgray', prob=T)
lines(density(p$vitd), lwd=2)
curve(dnorm(x, mean=mean(p$vitd), sd=sd(p$vitd)), 
      col="red", lwd=2, add=TRUE)
qqnorm(p$vitd) 
qqline(p$vitd)

给出预期的输出:

所以我只能弄清楚如何返回一个对象

喜欢

norm_f <- function(y){
  
list(qqnorm(y),qqline(y))
  
}

norm_f(p$vitd)

#或

norm_f <- function(y){
  
list(hist(y,  col='lightgray', prob=T),
     lines(density(y), lwd=2),
     curve(dnorm(x, mean=mean(y), sd=sd(y)), 
           col="red", lwd=2, add=TRUE))
  
}

norm_f(p$vitd)

我试过return(list(), list())- 但没用。

问题:如何让function 返回两个绘图对象?

另外,当运行norm_f(p$vitd) 时,function 会自动在Console 中打印大量文本 - 我怎样才能摆脱它?

数据

p <- structure(list(vitd = c(28.5, 32.9, 60.3, 50.5, 15, 47.8, 78.7, 
16.3, 71.9, 32.1, 33.2, 20.3, 33.5, 25.3, 89.8, 39.8, 27.6, 15.1, 
61.8, 50.8, 72.1, 13.1, 18.3, 67.1, 60.2, 53.7, 54.6, 11.4, 48.5, 
78.1, 29.1, 55.4, 75.1, 69.3, 91.2, 19.7, 26.9, 54.5, 25, 84.4, 
15.6, 76.6, 45, 39.4, 67.6, 53.9, 93.6, 43.9, 25.8, 49.6, 46.1, 
46.5, 57.3, 61.4, 29.8, 67.8, 64.4, 59.4, 44, 58.8, 5.2, 23.8, 
26.7, 42.3, 19.9, 72.4, 54.2, 69.5, 70.1, 22.1, 46.3, 52.2, 61.7, 
50.7, 46.9, 28, 29.4, 29.7, 72.4, 96.6, 55.5, 36.2, 36.2, 61.8, 
76.7, 43.5, 41.9, 76.8, 90, 44.4, 33, 46, 28.2, 47.7, 40.7, 41.4, 
53.2, 53.9, 35.3, 14.9)), row.names = c(NA, 100L), class = "data.frame")

【问题讨论】:

  • 基本图形函数通常不返回图形对象:绘图部分是调用函数的副作用。许多绘图函数返回一个(非图形)对象,可用于重新生成绘图,和/或它包含有关处理的好消息(例如,legend 返回其边界框)。此外,一个函数只能返回一个“事物”;通常,当返回异构数据时,它是一个命名列表。您需要将返回的图形对象用作什么?
  • 嗨@r2evans - 感谢您的意见。只是想了解一些关于functions 的知识。我的目的是生成一个函数,以快速了解协变量服从正态分布。 norm_f(p$vitd) 运行时返回一个图表。
  • 它不是返回一个图表,它是产生一个副作用的图。随意拥有每个图形函数的返回对象的list,但要意识到它们并不一致,有些只是NULL。同样,您希望如何处理这个返回值?
  • 我的目标是编写一个函数norm_f(x),它产生两个x 的图(上面描述的histogramqq-plot)。这个可以吗?
  • 编写一个产生两个图的函数与返回两个图的概念完全不同。使用基本图形,后者是不可能的,但前者肯定是。您的“函数”前提是正确的,但您假设 R 基本图形函数返回“绘图”是不正确的。大多数基本图形函数不返回绘图;如果他们返回任何东西,那个“东西”可能是可以重复使用以重新生成情节的东西,但这既不是常态,也不是一回事。

标签: r function plot


【解决方案1】:

这是你想要做的吗?

norm_f <- function(z, hist. = list(col = "lightgray"),
                   lines. = list(lwd = 2), curve. = list(col = "red", lwd = 2),
                   qqnorm. = list(col = "gray70", pch = 16, cex = 0.5), qqline. = list(lwd = 2)) {
  zname <- deparse(substitute(z))
  zden <- density(z)
  if (!"ylim" %in% names(hist.)) {
    ymax <- max(zden$y, dnorm(c(seq(min(z), max(z), len = 21)), mean = mean(z), sd = sd(z)))
    hist.$ylim <- c(0, ymax)
  }
  par(mfrow=c(1,2), mar=c(5,5,2,2))
  if (!"main" %in% names(hist.)) hist.$main <- paste("Histogram of", zname)
  if (!"xlab" %in% names(hist.)) hist.$xlab <- zname
  do.call(hist, c(list(z,  prob = TRUE), hist.))
  do.call(lines, c(list(zden), lines.))
  do.call(curve, c(list(substitute(dnorm(x, mean=mean(z), sd=sd(z))),
                        add = TRUE), curve.))
  do.call(qqnorm, c(list(z), qqnorm.))
  do.call(qqline, c(list(z), qqline.))
}

norm_f(iris$Sepal.Length)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2018-10-08
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多