2013-10-27 11 views
8

Dlaczego moja funkcja R nie powróci lub nie wydrukuje wykresu? Kod znajduje się poniżej. Wydaje się, że cały kod działa dobrze, z wyjątkiem fabuły. Bez względu na to, co robię, nie mogę uzyskać R, aby utworzyć wykres po wywołaniu funkcji. Rozglądając się po Internecie, nie mogę znaleźć żadnego powodu, dla którego to by nie zadziałało.Powróć z funkcji 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) 

} 

Wszelkie pomysły?

+0

Nie potrzeba 'return', jeśli dzwonisz z najwyższego poziomu (np. z konsoli). Jeśli chcesz wyświetlić wykres, po prostu wywołaj linię 'plot' bez jej zapisywania,' print'-ing it lub 'return'-ing. – Thomas

+0

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

+0

@Thomas: Ale nie dzwonię z najwyższego poziomu, jest osadzony w wywołaniu funkcji. Jeśli zadzwonię do tej funkcji, to w ogóle nie rysuje. Nawet bez drukowania/zwrotu. –

Odpowiedz

4

To działa. Jak sugeruje, można zaoszczędzić więcej niż jednego przedmiotu za pomocą listy:

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]] 

Ale pewnie wolisz tylko zapisać d.power a następnie zadzwonić do kreślenia wykresu:

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

W bazie R można zapisać działki na dysku. Nie wierzę, że możesz je zapisać na dysku.
Zastosowanie ggplot2 zamiast

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

Możesz sortować z 'recordPlot' ... –

+0

Dzięki @MatthewPlourde, byłem niezaznajomiony z tą funkcją. Nie wygląda na to, że jesteś "w pewnym sensie", ale absolutnie możesz, haha;) Napisz to jako odpowiedź? –

1

Twój kod nie działa na moim gdzie zmienna R brakuje, ale tutaj jest jak I wywołać funkcję i zwraca obiekt wykresu.

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

Wezwanie do "return()" kończy wywołanie funkcji, więc nic po nim jest ignorowany

Przymierz pozbycie

return (d.power) 

lub przeniesienie go do po zdefiniowaniu i wydrukowaniu wykresu.

W powiązanej notatce nie można zwrócić dwóch obiektów z jednej funkcji. Wybierz jeden lub umieść go na liście i zwróć listę.