如何知道应用程序是在本地运行还是在服务器上运行?(R Shiny)

8
我在我的笔记本电脑上测试我的应用程序,然后将其部署到shinyapps服务器。在部署之前,我需要删除设置路径的语句,例如:
setwd('/Users/MrY/OneDrive/Data')

代码能否找出它是在本地运行还是在服务器上运行,就像这样:
if (isLocal()) {
       setwd('/Users/MrY/OneDrive/Data')
}

一个微不足道的示例代码(如果不删除 setwd ,它将在服务器上失败):

server.R

library(shiny)

setwd('/Users/Yuji/OneDrive/Data/TownState')  

data = 'data1.csv'  # to test, using an empty .csv file

shinyServer(function(input, output) {


}) 

ui.R

library(shiny)

shinyUI(pageWithSidebar(
    headerPanel("Click the button"),

    sidebarPanel(
        actionButton("goButton", "Go!")
    ),
    mainPanel(

    )
))
3个回答

9

在Shiny中完成此任务的标准方法是使用:Sys.getenv('SHINY_PORT')。您可以编写如下内容:

is_local <- Sys.getenv('SHINY_PORT') == ""

假设您不会自己更改端口变量,这是不太可能的。只是好奇,它是否比查看实际会话主机名或端口更可靠/更好?Shiny团队中有人说过这是最佳方法吗? - DeanAttali
Yep - Vincent

8

2020年更新:目前仍没有官方方法实现此功能,但我建议使用Yihui的方法:is_local <- Sys.getenv('SHINY_PORT') == ""


我不知道这是否是正确的方法,但您可以使用session$clientData$url_hostname来查看主机名。当您在本地运行时,除非您专门更改了主机名,否则它将会是127.0.0.1,我猜在shinyapps上它应该是shinyapps.io。示例代码:

runApp(shinyApp(
  ui = fluidPage(
  ),
  server = function(input, output, session) {
    observe({
      if (session$clientData$url_hostname == "127.0.0.1") {
        setwd(...)
      }
    })
  }
))

这种方法应该可以解决问题,不过我不能保证它是否是最佳方案。


我猜这行代码会在所有 global.R 文件被加载后运行,对于那些需要在应用程序启动时立即发生的事情来说可能太晚了? - agenis
正确的,全局运行在这之前。这个答案已经有4年了,自那时以来我已经看过闪亮的源代码,现在我知道闪亮的做法是通过设置一个环境变量,尽管我不记得它叫什么! - DeanAttali
现在2020年最好的方法是什么?我也很想知道。 - mynameisJEFF
目前仍没有官方方法,但我使用了 Yihui 的建议。is_local <- Sys.getenv('SHINY_PORT') == "" - DeanAttali

1
你可以检索主机名和查询。计算机应该有不同的主机名。
    library(R.utils)
    hname <- System$getHostname()

产生
           nodename 
"mikes-air-3.wisedom.local"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接