График возврата из функции 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 

enter image description here