我们如何在 Shiny 应用程序中使用 `names()` 或替代名称 `reactiveVal`?

How can we use `names()` or an alternative to name `reactiveVal` inside Shiny app?

我尝试在闪亮的应用程序中的 reactiveVal 上使用 names() 但没有成功。


这可能吗? name 闪亮应用中的反应值有哪些替代方法?


我的第一次尝试抛出错误:

names(r()) <- "something"

Error in names(r()) <- "something" : invalid (NULL) left side of assignment

我的第二次尝试也是:

names(r) <- "something"

Error in names(r) <- "something" : names() applied to a non-vector


这是一个最小的示例应用程序:

library(shiny)

ui <- fluidPage(mainPanel(textOutput("text")))

server <- function(input, output) {
  r <- reactiveVal(1)
  # names(r) <- "something"
  output$text <- renderText(
    paste0("The reactiveVal is ", r(),". It's name is ", names(r()),"."))
}

shinyApp(ui = ui, server = server)

关键在于有关如何设置值的文档。来自文档:

Call the function with no arguments to (reactively) read the value; call the function with a single argument to set the value.

这意味着它有点深奥,我个人更喜欢使用 magrittr 别名和管道来保持可读性。稍后设置反应值名称的关键步骤是:

  • 不带参数调用它r(),以读取当前值。
  • 将调用包装在 isolate 中以防止在这一步发生任何反应
  • 将返回值与名称字符串一起传递给 set_names
  • 再次调用反应值 r 并将命名值作为参数,以设置 r
library(shiny)
library(magrittr)
ui <- fluidPage(mainPanel(textOutput("text")))

server <- function(input, output) {
  r <- reactiveVal(1 %>% set_names("something")) #setting the name on initial

  isolate(r()) %>% 
    set_names("something else") %>%  
    r()
  output$text <- renderText(
    paste0("The reactiveVal is ", r(),". It's name is ", names(r()),"."))
}

shinyApp(ui = ui, server = server)
#> PhantomJS not found. You can install it with webshot::install_phantomjs(). If it is installed, please make sure the phantomjs executable can be found via the PATH variable.

静态 R Markdown 文档不支持 Shiny 应用程序

reprex package (v0.3.0)

于 2019-08-07 创建

您不能在 R 中命名变量;这个概念在 R 中根本没有意义。

如果您想在呈现变量时为变量提供更好的标签,有多种方法可以实现,具体取决于您呈现变量的方式。

对于 Shiny 中的 reactiveVal,您可以分配一个 "label" (reactiveVal(value, label="my super reactive")),但这仅用于调试目的。

如果要将命名索引分配给向量的元素,即

a <- 1:3
names(a) <- c('Bob','Foo','Bar')
a
# Bob Foo Bar 
#  1   2   3 

但是变量被包装在反应式中,在反应式中分配命名:

r <- reactiveVal(structure(1, .Names='something'))

或来自 observe:

a <- 1:3
names(a) <- c('Bob','Foo','Bar')
r(a) ## assigns a value to the reactive    

更新以回应评论

What do you mean with You cannot name a variable in R; the concept simply does not make sense within R.? Isn't using names() exactly naming a variable? ..I don't get it. Can you explain this a little further?

变量的名称是什么?这是我们用来称呼它的符号。在上面的示例中,我使用 ar 来表示两个不同的 names/symbols 来表示两个不同的变量。

函数names()是指设置和获取变量的条目、元素和列的名称。对于原子向量或列表 (a <- c(1, 2, 3); names(a) <- c('a','b','c')),这与命名索引(或列表的键值对)相同,其中使用 'a'、'b' 和 'c'引用 a 中的特定条目,另外的好处是 'a'、'b' 和 'c' 可以由变量本身引用。

所以names引用了一个属性*的变量引用的对象。当您使用 r <- reactiveVal(1) 为反应式赋值时,r 指的是反应式对象,该对象包含一个原子向量,其中单个元素的值为“1”。 names(r) 没有为反应对象定义。

*:从技术上讲,它是一个属性。尝试 attr(a) 看看。