Sys.getenv() 在 Shiny Apps 中返回空

Posted

技术标签:

【中文标题】Sys.getenv() 在 Shiny Apps 中返回空【英文标题】:Sys.getenv() returns empty in Shiny Apps 【发布时间】:2016-08-19 14:26:29 【问题描述】:

注意 我编辑了问题,因为PG_HOST的使用引起了混乱,但精神是一样的

我正在运行一个闪亮的应用程序,需要读取一些环境变量。

这些变量是在闪亮服务器启动之前定义的。例如

export APPLE=apple
export PENCIL=pencil

global.R(或者server.R开头也是一样的)我写了如下代码:

manzana <- Sys.getenv('APPLE')
lapiz <- Sys.getenv('PENCIL')

但那些变量是空的。

如果我在 R 控制台中运行该代码,两者都会返回正确的值。

为什么这不起作用? R 控制台和闪亮的应用程序有何不同? 我怎样才能得到真正的环境变量(在这个假例子$APPLE$PENCIL)? 配置闪亮应用的正确方法是什么?

【问题讨论】:

shell 中的 PATH 与 R 看到的 PATH 不同。在 R 控制台上尝试system("echo $PG_HOST") 看看是否正确。既然你知道如何使用Sys.getenv,那么前进的道路现在应该很清楚了。 感谢您的回答,实际上,Sys.getenv 在控制台和闪亮的应用程序中的返回非常不同。我不是专家(显然),但我不知道如何从这里开始。能不能说的具体点? 几个重要问题....数据库是云数据库还是平面文件?它需要身份验证吗?当您部署闪亮的应用程序时...本地文件系统的路径将无效...因为它不是从您的本地计算机提供的。有一些解决方法......即在本地更新您的数据库,然后将新数据库推送到从您的应用程序调用的云文件中。 你真的应该看看这个postgresql.org/docs/8.3/static/libpq-envars.html @CarlBoneri 感谢您的回答,但问题是闪亮没有按预期读取环境变量。任何环境变量。 【参考方案1】:

第一步是了解反应性。查看闪亮的教程。

使用您的示例..种类..这是一个应用程序更新和设置可以多种方式调用的变量....

shiny_example <- function()

  server <- shinyServer(function(session,input,output)
    the_slots <- list(Apple = 'apple',Green = 'green')

    make_globs <- function(new_var = NULL)
      if(!is.null(new_var))
        the_slots <<- append(the_slots,new_var)
      
    

    glob_vals <- the_slots

    glob_vals <- eventReactive(input$saver, 
      set_new_vars <- list(input$new_var)
      names(set_new_vars) <- input$new_var_name
      the_slots <<- make_globs(new_var = set_new_vars)
      lapply(list('new_var','new_var_name'),function(i)updateTextInput(session,i, value = ""))
      return(the_slots)

    )

    output$envs <- renderPrint(

      glob_vals()

    )

    output$sels <- renderUI(
      vals <- 1:length(glob_vals())
      Opts <- unlist(lapply(vals,function(i)sprintf('<option value="%s">%s</option>',i,names(glob_vals()[i])))) %>% HTML
      HTML(
        paste(
          "<div class='shiny-input-container'>",
          "<label class='control-label' for='the_ups'></label>",
          "<div><select id='the_ups'>",Opts,"</select></div>",
          "</div>",sep=""))
    )

    output$sel_vals <- renderPrint(
      ref_cards <- lapply(1:length(glob_vals()),function(i)
        data.frame(the_names = names(glob_vals()[i]),the_vals = glob_vals()[[i]]))%>%
        rbind.pages

      ref_cards[input$the_ups,'the_vals']


    )

  )


  ui <- shinyUI(
    bootstrapPage(
      tags$div(class="container",
               fluidRow(
                 tags$h4(HTML('These inputs will update the variable list \n like a variable in Sys.getenv()')),
                 column(6,textInput(inputId = "new_var_name",label = "variable name")),
                 column(6,textInput(inputId = "new_var",label = 'variable value'))
               ),
               fluidRow(

                 column(6,
                        tags$h4(
                          HTML('Pressing the `add_new` button will load the variables and display the corresponding values below'),
                          actionButton(inputId = "saver",label = "add_new")
                        )),
                 column(6,tags$h4("You can even dynamically update a selection input with newly created paths or environment variables"),
                        uiOutput('sels'))
               ),
               fluidRow(
                 column(6,verbatimTextOutput('envs')),
                 column(6,verbatimTextOutput('sel_vals')))
      )))

  shinyApp(ui,server)


结果:

【讨论】:

再次感谢,但我真的很想用Sys.getenv从环境中读取一个变量... 我能问一下为什么吗? Sys.getenv 是一个从存储列表中提取命名变量的函数......但无论如何,祝你好运 我不想硬编码一些信息(如密码、url、端口等)所以我虽然可以从环境变量中读取它。这就是 Sys.getenv 所做的

以上是关于Sys.getenv() 在 Shiny Apps 中返回空的主要内容,如果未能解决你的问题,请参考以下文章

R语言sys方法:Sys.getenv函数获取R环境变量Sys.getlocale函数获取当前系统本地信息Sys.setlocale函数设置当前系统本地信息

R:TinyTex 安装错误:`xfun::download_file(..., quiet = Sys.getenv("APPVEYOR") != "") 中

R实用命令

R语言常用sys函数汇总:sys.chmodSys.DateSys.timeSys.getenvSys.getlocalesys.getpidsys.globsys.info等

SparkR - 覆盖 spark.conf 中的默认参数

$ 使用 snowFall 的问题