【发布时间】: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的图(上面描述的histogram和qq-plot)。这个可以吗? -
编写一个产生两个图的函数与返回两个图的概念完全不同。使用基本图形,后者是不可能的,但前者肯定是。您的“函数”前提是正确的,但您假设 R 基本图形函数返回“绘图”是不正确的。大多数基本图形函数不返回绘图;如果他们返回任何东西,那个“东西”可能是可以重复使用以重新生成情节的东西,但这既不是常态,也不是一回事。