【问题标题】:Return plot from R function从 R 函数返回图
【发布时间】:2015-09-21 21:10:26
【问题描述】:

为什么我的 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)

}

有什么想法吗?

【问题讨论】:

  • 如果您从顶层调用(即从控制台),则不需要return。如果要显示绘图,只需调用plot 行而不存储它,print-ing 它,或return-ing 它。
  • @Thomas:但我不是从顶层调用,它嵌入在函数调用中。如果我调用该函数,它根本不会绘图。即使没有打印/返回。
  • @B.Mr.W.:你能具体解释一下那个链接中的内容应该对我有什么帮助吗?该问题的答案是使用“打印”,我已经明确表示它不起作用。
  • 你是否在到达情节之前故意返回d.power?或者这只是您在发布问题时忘记删除的测试的一部分?

标签: r 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

      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)
      

      【讨论】:

      • 感谢@MatthewPlourde,我不熟悉该功能。看起来你“有点可以”,但绝对可以,哈哈;)将其作为答案发布?
      • 以下语句可能需要编辑:“在基础 R 中,您可以将绘图保存到磁盘。我不相信您可以将它们保存到磁盘。”
      【解决方案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 
      

      【讨论】:

        猜你喜欢
        • 2017-03-26
        • 1970-01-01
        • 2013-01-05
        • 2019-06-29
        • 2015-08-22
        • 2015-06-16
        • 2021-05-03
        • 2021-04-09
        • 1970-01-01
        相关资源
        最近更新 更多