browser() 和 ls() 之间的交互

Interaction between browser() and ls()

您好,我正在尝试查找有关 R Shiny 应用程序中 browser()ls() 之间交互的幕后情况的一些信息。

如果我在 R Shiny 函数之外的代码中添加 browser() 语句,例如:

browser()
output$graph_1 <- renderPlot({...})

然后在控制台中调用 ls() 我看到在我的环境中定义的所有变量,正如预期的那样。一切都很好。

但是,如果我在 R Shiny 函数中调用添加 browser() 语句,例如:

output$graph_1 <- renderPlot({
    browser()
    ...
})

然后调用 ls() 然后我只看到函数中定义的那些变量。

我从ls()documentation的理解是应该return环境中的所有变量,本例中的环境是R Shiny会话。但是我找不到任何关于它如何与 Shiny 函数交互的提及(或者我没有在 Google 上找到正确的关键词)。

从 Shiny 函数内部调用 ls() 是否意味着该函数 环境?还是有其他事情在起作用?有没有办法从 Shiny 函数中强制列出所有变量?

我正在使用 mac 和 运行 R 4.2.0、R Studio RStudio 2022.02.2+485 和 shiny 版本 1.7.1

and the environment in this case is the R Shiny session

不,那是误会。在函数调用的情况下,“环境”是该函数的本地环境。但是,您的情况仍然略有不同,因为您需要区分函数的本地环境和函数 call.

在函数 call 中(这是你所处的情况),环境是调用周围的环境,所以你的两种情况都应该为 [= 产生相同的结果11=]。至少 通常 是这样。但是,Shiny 的反应式效用函数(包括 render* 函数)不会以标准方式评估它们的参数。相反,他们使用 non-standard evaluation,参数表达式在其自己的本地环境中计算。

您需要走上 call stack 才能看到在函数外定义的变量。在 RStudio 中,您可以通常为此目的使用“Traceback”面板,但这似乎不适用于 Shiny。

相反,parent.env(environment()) 会给你那个表达式的父环境,你可以 运行 ls() 在那:

ls(parent.env(environment()))

现在您应该会看到在您的服务器函数中定义的变量。