2013-10-27 10 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

Вам не нужно 'return', если вы звоните с верхнего уровня (то есть с консоли). Если вы хотите отобразить график, просто вызовите строку 'plot', не сохраняя ее, не распечатывайте или не возвращайте. – Thomas

+0

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

+0

@Thomas: Но я не звоню с верхнего уровня, он встроен в вызов функции. Если я вызову функцию, она вообще не будет отображаться. Даже без печати/возврата. –

ответ

4

Это работает. Как было предложено, вы можете сохранить более одного объекта с помощью списка:

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

Ваш код не работает на моей, где переменная г отсутствует, но вот как я называю функцию и возвращает объект участок.

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) 

или перемещая его после того, как вы определите и распечатаете график.

В соответствующей заметке вы не можете вернуть два объекта из одной функции. Выберите один или поместите их в список и верните список.

Смежные вопросы