我们如何在 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?
变量的名称是什么?这是我们用来称呼它的符号。在上面的示例中,我使用 a
和 r
来表示两个不同的 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)
看看。
我尝试在闪亮的应用程序中的 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?
变量的名称是什么?这是我们用来称呼它的符号。在上面的示例中,我使用 a
和 r
来表示两个不同的 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)
看看。