Результат col_word
- символьное значение (например, «летучая мышь»).
Для plot_ly
вам нужен столбец фрейма данных, список или вектор, а не строка символов.
Вы можете обойти это в ggplot
, используя aes_string
. Однако в plotly
вам нужна альтернатива --- вы можете попробовать:
plot_ly(df2, x = ~class, y = ~get(col_word), type = 'bar') %>%
layout(yaxis = list(title = 'Count'), xaxis = list(title = ""))
Или:
plot_ly(df2, x = ~class, y = as.formula(paste0('~', col_word)), type = 'bar') %>%
layout(yaxis = list(title = 'Count'), xaxis = list(title = ""))
Edit : обязательно используйте renderPlotly
(обратите внимание на 'ly' в конце).
Вот полный рабочий пример в R Markdown с shiny
:
---
title: "Test509"
author: "Ben"
date: "5/9/2020"
output: html_document
---
```{r setup, include=FALSE}
library(shiny)
library(plotly)
library(tidyverse)
```
```{r}
df1 <- data.frame(words = c("bat", "vat","cat","mat"), count = c(3420, 2098, 2003, 1501), words_count = c("bat (3420)","vat (2098)", "cat (2003)", "mat (1501)"), stringsAsFactors = FALSE)
df2 <- data.frame(class = c("A","B","C","D"), bat = c(10,0,30,20), vat = c(0,0,10,30), cat = c(20,30,0,10), mat = c(20,20,0,0), stringsAsFactors = FALSE)
inputPanel(
selectInput("words", label = "Choose the word",
choices = df1$words_count,
selected = df1$words_count[1], width = '100%')
)
renderPlotly({
# Extract the word from drop down
col_word <- df1 %>%
filter(words_count == input$words) %>%
pull(words)
plot_ly(df2, x = ~class, y = ~get(col_word), type = 'bar') %>%
layout(yaxis = list(title = 'Count'), xaxis = list(title = ""))
})
```