График возврата из функции R
Почему моя функция R не вернется или не распечатает сюжет? Код ниже. Весь код, похоже, работает нормально, за исключением сюжета. Независимо от того, что я делаю, я не могу заставить R создать сюжет при вызове функции. Оглядываясь в Интернете, я не могу найти причин, почему это не сработает.
powerc.fun <- function(n,sigma,r){
a <- 0.05
d <- seq(-20,20,2)
power <- rep(NA,length(d))
p.lab <- rep(NA,length(d))
for (j in 1:length(d)){
mu1 <- 110
mu2 <- mu1-d[j]
reject <- rep(NA,r)
for (i in 1:r){
sample1 <- rnorm(n,mu1,sigma)
sample2 <- rnorm(n,mu2,sigma)
sample.t <- t.test(sample1,sample2)
p.val <- sample.t[3]
reject[i] <- p.val<a
power[j] <- sum(reject)/length(reject)
p.lab[j] <- paste('d=',d[j],sep='')
}}
d.power <- cbind(d,power)
return(d.power)
p.plot <- plot(d.power[,1], d.power[,2], type="l", xlab=bquote(H[a]), ylab="Power", main="Power Calculations for Two Sample T Test")
print(p.plot)
return(p.plot)
}
Есть идеи?
Ответы
Ответ 1
Это работает. Как и было предложено, вы можете сохранить несколько объектов, используя список:
powerc.fun <- function(n,sigma,r){
a <- 0.05
d <- seq(-20,20,2)
power <- rep(NA,length(d))
p.lab <- rep(NA,length(d))
for (j in 1:length(d)){
mu1 <- 110
mu2 <- mu1-d[j]
reject <- rep(NA,r)
for (i in 1:r){
sample1 <- rnorm(n,mu1,sigma)
sample2 <- rnorm(n,mu2,sigma)
sample.t <- t.test(sample1,sample2)
p.val <- sample.t[3]
reject[i] <- p.val<a
power[j] <- sum(reject)/length(reject)
p.lab[j] <- paste('d=',d[j],sep='')
}}
d.power <- cbind(d,power)
p.plot <- plot(d.power[,1], d.power[,2], type="l", xlab=bquote(H[a]), ylab="Power", main="Power Calculations for Two Sample T Test")
return(list(p.plot, d.power))
}
# prints the plot and saves d.power values
output <- powerc.fun(100,0.1,10)
# d.power values
output[[2]]
Но, вероятно, вы предпочитаете просто сохранять d.power
а затем называть его для построения графика:
powerc.fun <- function(n,sigma,r){
a <- 0.05
d <- seq(-20,20,2)
power <- rep(NA,length(d))
p.lab <- rep(NA,length(d))
for (j in 1:length(d)){
mu1 <- 110
mu2 <- mu1-d[j]
reject <- rep(NA,r)
for (i in 1:r){
sample1 <- rnorm(n,mu1,sigma)
sample2 <- rnorm(n,mu2,sigma)
sample.t <- t.test(sample1,sample2)
p.val <- sample.t[3]
reject[i] <- p.val<a
power[j] <- sum(reject)/length(reject)
p.lab[j] <- paste('d=',d[j],sep='')
}}
d.power <- cbind(d,power)
return(d.power)
}
# saves d.power
output <- powerc.fun(100,0.1,10)
# plot
p.plot <- plot(output[,1], output[,2], type="l", xlab=bquote(H[a]), ylab="Power", main="Power Calculations for Two Sample T Test")
Ответ 2
Вызов "return()" завершает вызов функции, поэтому все после его игнорирования
Попробуйте избавиться от
return (d.power)
или переместить его после определения и печати сюжета.
В связанной заметке вы не можете вернуть два объекта из одной функции. Выберите один или поместите их в список и верните список.
Ответ 3
В базе R
вы можете сохранять графики на диск. Я не верю, что вы можете сохранить их на диск.
ggplot2
этого используйте ggplot2
library(ggplot2)
.
.
.
p.plot <- qplot(as.data.frame(d.power), aes(x=d, y=power)) +
geom_line() +
labs(x=bquote(H[a]), y="Power", title="Power Calculations for Two Sample T Test")
# double check the xlab, it might be incorrect
return(p.plot)
Ответ 4
Ваш код не работает на моем, где отсутствует переменная r, но вот как я вызываю функцию и возвращаю объект сюжета.
library(ggplot2)
data(mtcars)
my.plot <- function() {
result <- ggplot(data=mtcars, aes(x=wt, y=mpg)) + geom_point()
# you can forget the return below because R will take the last expression which is result as return value
# return(result)
}
a <- my.plot()
> class(a)
[1] "gg" "ggplot"
> a