2013-10-27 13 views
8

Warum gibt meine R-Funktion kein Plot zurück oder druckt sie? Der Code ist unten. Der gesamte Code scheint gut zu funktionieren, außer der Handlung. Egal, was ich mache, ich kann R nicht dazu bringen, das Plot zu erstellen, wenn die Funktion aufgerufen wird. Wenn ich mich online umsehe, kann ich keinen Grund finden, warum das nicht funktionieren würde.Rückgabeplot von R-Funktion

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) 

} 

Irgendwelche Ideen?

+0

Sie brauchen nicht 'return', wenn Sie von der obersten Ebene (dh von der Konsole aus) anrufen. Wenn Sie das Diagramm anzeigen möchten, rufen Sie einfach die Zeile 'plot' auf, ohne sie zu speichern, zu drucken, zu returnieren. – Thomas

+0

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

+0

@Thomas: Aber ich rufe nicht von der obersten Ebene, es ist in einem Funktionsaufruf eingebettet. Wenn ich die Funktion aufruft, zeichnet sie überhaupt nicht auf. Auch ohne Druck/Rückgabe. –

Antwort

4

Das funktioniert. Wie bereits angedeutet, können Sie mithilfe einer Liste mehr als ein Objekt speichern:

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

Aber wahrscheinlich bevorzugen Sie nur d.power speichern und dann die Grafik rufen zum Plotten:

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

In der Basis R können Sie Diagramme auf der Festplatte speichern. Ich glaube nicht, dass Sie sie auf der Festplatte speichern können.
Verwenden ggplot2 statt

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

Sie können irgendwie mit 'recordPlot' ... –

+0

Dank @MatthewPlourde, war ich mit dieser Funktion nicht vertraut. Es scheint nicht so, als könntest du "irgendwie" sondern absolut können, haha;) Post das als Antwort? –

1

Ihr Code funktioniert nicht auf meinem wo Variable r fehlt, aber hier ist, wie ich eine Funktion aufrufen und ein Grundstück Objekt zurück.

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

auf einen Anruf "return()" beendet den Funktionsaufruf, so etwas, nachdem er ignoriert

Versuchen loszuwerden

return (d.power) 

oder bewegt es zu nachdem Sie das Diagramm definiert und gedruckt haben.

Zu einem verwandten Hinweis können Sie nicht zwei Objekte aus einer Funktion zurückgeben. Wählen Sie einen aus oder fügen Sie ihn in eine Liste ein und geben Sie die Liste zurück.