2013-10-27 205 views
8

爲什麼我的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) 

} 

任何想法?

+0

你不需要的建議,您可以通過使用一個列表保存多個對象如果你是從頂層調用(即從控制檯)調用'返回'。如果你想顯示圖表,只需調用'plot'行而不存儲它,'打印'或'返回'它。 – Thomas

+0

http://stackoverflow.com/questions/11799317/custom-function-ggplot-and-return-values –

+0

@Thomas:但我沒有從頂層調用,它嵌入在函數調用中。如果我調用這個函數,它根本不會繪製。即使沒有打印/返回。 –

回答

4

This Works。

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

在基地R您可以將圖保存到磁盤。我不相信你可以將它們保存到磁盤。
使用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) 
+0

你可以用'recordPlot' ... –

+0

感謝@MatthewPlourde,我對這個功能並不熟悉。它似乎不像你「有點可以」,但絕對可以,哈哈;)作爲答案發布? –

1

您的代碼不會對變量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

3

的調用 「返回()」 結尾的函數調用,所以以後這事被忽略

儘量擺脫

return (d.power) 

或將其移動到在你定義和打印圖之後。

在相關說明中,不能從一個函數返回兩個對象。選擇一個或放在一個列表中並返回列表。