r - 在 ShinyServer 中使用函数创建数据以提供 ggplot

标签 r function ggplot2 shiny

我有一个 Shiny 应用程序,它可以计算某种遗传关联研究的一些功效估计值。 ui.R 非常简单,server.R 有一个函数可以给出数据框(我想我不能把这个函数设为 reactive,因为它有一些参数)。

要点的链接是 here .运行它:

library(shiny)
shiny:: runGist('5895082')

该应用程序正确计算了估计值,但我对此有两个问题:
  • 是否可以拥有 output$powTable实际上代表范围内包含的所有值,在第一个sliderInput(n.cases) ?.它似乎只代表范围的两个极端值......我做错了什么?
  • 运行应用程序时出现错误:
    Error: Reading objects from shinyoutput object not allowed.

  • 如何从函数 f() 传递数据( react 性?)喂养ggplot?经过多次反复试验,我非常迷茫。我的代码中的错误在哪里?提前多谢!

    该函数的原始代码运行良好:(已编辑)
     f <- function(ncases, p0, OR.cas.ctrl, Nh, sig.level) {
    num.cases <- ncases
    p0 <- p0
    Nh <- Nh
    OR.cas.ctrl <- OR.cas.ctrl
    sig.level <- sig.level
    # Parameters related to sig.level, from [Table 2] of Samuels et al.
    # For 90% power and alpha = .05, Nscaled = 8.5
        if (sig.level == 0.05){
    A <- -28 # Parameter A for alpha=.05
    x0 <- 2.6 # Parameter x0 for alpha=.05
    d <- 2.4 # Parameter d for alpha=.05
        }
        if (sig.level == 0.01){
    A <- -13 # Parameter A for alpha=.01
    x0 <- 5 # Parameter x0 for alpha=.01
    d <- 2.5 # Parameter d for alpha=.01
        }
        if (sig.level == 0.001){
    A <- -7 # Parameter A for alpha=.001
    x0 <- 7.4 # Parameter x0 for alpha=.001
    d <- 2.8 # Parameter d for alpha=.001
        }
        out.pow <- NULL # initialize vector
    for(ncases in ncases){
        OR.ctrl.cas <- 1 / OR.cas.ctrl # 1. CALCULATE P1 FROM A PREDEFINED P0, AND A DESIRED OR
        OR <- OR.ctrl.cas
        bracket.pw <- p0 / (OR - OR*p0) # obtained after isolating p1 in OR equation [3].
        p1 <- bracket.pw / (1 + bracket.pw)
        Nh037 <- Nh^0.37 # 2. CALCULATE NSCALED
        num.n <- num.cases*((p1-p0)^2)
        den.n <- (p1*(1-p1) + p0*(1-p0))*Nh037
        Nscaled <- num.n/den.n
        num.power <- A - 100 # 3. CALCULATE POWER
        den.power <- 1 + exp((Nscaled - x0)/d)
        power <- 100 + (num.power/den.power) # The power I have to detect a given OR with my     data, at a given alpha
        }
    OR <- OR.cas.ctrl
    out.pow <- data.frame(num.cases, Nh, Nscaled, p0, OR, sig.level, power)
    out.pow
    } 
    
    mydata <- f(ncases=seq(50,1000, by=50), 0.4, 2.25, 11, 0.05)
    mydata
    
    library(ggplot2)
    print(ggplot(data = mydata, aes(num.cases, power)) +
    theme_bw() +
    theme(text=element_text(family="Helvetica", size=12)) +
    labs(title = "Ad-hoc power for haplogroup") +
        scale_color_brewer(palette = "Dark2", guide = guide_legend(reverse=TRUE)) +
    xlab("number of cases/controls") +
    ylab("power") +
    scale_x_log10() +
    geom_line(alpha=0.8, size=0.2) +
    geom_point(aes(shape = factor(OR)), colour="black"))
    

    最佳答案

    首先,您有n.cases我认为命名不一致。它是 n.cases有时,还有 ncases其他时间。这是一个错误吗?

    不管怎样,output$mydata()是不正确的。这不是输出。它应该只是:

    mydata <- reactive(f(input$n.cases,
      input$p0,
      input$OR.cas.ctrl,
      input$Nh,
      input$sig.level))
    

    然后在 output$powHap() 中执行它时它应该是:
    output$powHap <- renderPlot(
    {
       print(ggplot(data = mydata(), aes(ncases, power)) + 
         theme_bw() + 
         theme(text=element_text(family="Helvetica", size=12)) + 
         labs(title = "Ad-hoc power for haplogroup") +
         scale_color_brewer(palette = "Dark2", guide = guide_legend(reverse=TRUE)) +
         xlab("number of cases/controls") +
         ylab("power") +
         scale_x_log10() +
         geom_line(alpha=0.8, size=0.2) +
         geom_point(aes(shape = factor(OR)), colour="black"))
    })
    

    重要的部分是您需要执行以下操作:
    data = mydata()
    

    而不是
    data = output$mydata
    

    因为 output$mydata是一个( react 性)函数。

    我建议阅读 the documentation on how reactives work .之后整个事情应该更有意义。顺便说一下,对于一个非常可重复的示例,+1。这是所有问题都应该发布的方式。

    关于r - 在 ShinyServer 中使用函数创建数据以提供 ggplot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17401354/

    相关文章:

    r - 在 R 中加入列表

    mysql - 如何在 MySQL 函数中引发错误

    c++ - + 运算符,类类型和内置类型之间的区别?

    r - 如何将 ggplot 与 prop.table(table(x) 一起使用?

    r - ggplot2 无法加载,出现 'rlang' 包错误

    r - ggplot2 带有渐变颜色填充的水平条形图

    r - 在 mutate 中使用匿名函数

    r - 从列表值创建数据框

    r - POSIXct类中的毫秒

    function - Clojure 首先和休息