Как использовать textInput в Shiny для именования столбцов загруженного фрейма данных

Я пытаюсь найти способ использовать поле textInput, чтобы пользователи могли указывать имена столбцов фрейма данных в Shiny. Немного предыстории по приборной панели:

Панель инструментов позволяет пользователям загружать CSV-файл и указывать столбцы во фрейме данных, которые они хотят использовать. Затем они выбирают имена столбцов и строк. Данные, которые они загружают, затем будут преобразованы в меньший фрейм данных, который будет использоваться для анализа соответствия.

Все работает нормально, за исключением аспекта именования столбцов / строк. По какой-то причине, когда программа запускается, она назначает ввод текста как имя первой строки / столбца, а затем делает остальные названия «NA». Я попытался использовать strsplit (), чтобы разбить ввод текста, но это не сработало.

Может кто-нибудь сказать мне, что я делаю не так? Вот как выглядят мой код и проблема:

ui <- fluidPage(
  # Application title
  titlePanel("Perceptual Map Dashboard"),
  sidebarLayout(
# Sidebar with a slider and selection inputs
    sidebarPanel(

    #Excel doc row and column names
      numericInput(inputId="startcol",label="Input start column:",value="", min=1,max=10000),
      numericInput(inputId="endcol",label="Input end column:",value="", min=1,max=10000),
    #Inputing brands and emotions
      br(),
      numericInput(inputId = "rownums",label = "How many emotions are you evaluating?",value = "", min = 1,max = 10000),
      br(),
      textInput ( 'brands', 'List the brands included in your perceptual map (separated by commas):', value=""),
      textInput ( 'emotions', 'List the emotions included in your perceptual map (separated by commas):', value=""),
    #Removing brands and emotions

    #Select graph type
      textInput(inputId="plottitle",label="Title your graph:"),
    #Upload Excel Grid
      fileInput(inputId = 'data', 'Upload CSV File',
                accept=c('.csv')),
    actionButton("go","Create Map")
    ),

# Visual Output
    mainPanel(
      wellPanel(h4('Visual')),
      plotOutput(outputId = "plot",  width = "100%", height=500), 
      downloadButton("downloadPlot", "Download Visual")
        )
      )
    )



    server <- function(input,output){



      observeEvent(input$go,{

    x <- read.csv(input$data$datapath, header = F)
    print(x)
    str(x)


    plot1 <- reactive({
    x<-x[,as.numeric(input$startcol):as.numeric(input$endcol)]
    column.sums<-colSums(x)
    print(column.sums)
    pmd.matrix<-matrix(column.sums, byrow = T, nrow=as.numeric(input$rownums))
    pmd.df2<-as.data.frame(pmd.matrix)
    # colnames(pmd.df2) = names
    # print(pmd.df2)
    # # row.names(pmd.df2)= c(as.character(input$emotions))
    print(pmd.df2)
    fit <- CA(pmd.df2, graph=F)
    K <- plot.CA(fit, col.row = "blue", col.col="black",  cex=.6,new.plot=T,
                 title=input$plottitle)
    return(K)





        })

    output$plot<- renderPlot({

          print(plot1())

      })

    output$downloadPlot2 <- downloadHandler(
      filename = "Shinyplot.png",
      content = function(file) {
        png(file)
        print(plot1)
        dev.off()
      })



     })

    }



    shinyApp(ui = ui, server = server)


ISSUE I AM SEEING: 

       c("“Burlington”", "”JC Penny”", "”Kohls”", "”TJ Maxx”", "”Marshalls”", "”Nordstrom Rack”", "”Old Navy”", "”Target”", "”Walmart”", "”Macys”", "”Amazon”", "”Nordstrom”", "”Ross”")
    1                                                                                                                                                                                113
    2                                                                                                                                                                                113
    3                                                                                                                                                                                 69
    4                                                                                                                                                                                 55
    5                                                                                                                                                                                 91
    6                                                                                                                                                                                 73
    7                                                                                                                                                                                106
    8                                                                                                                                                                                 77
    9                                                                                                                                                                                 76
    10                                                                                                                                                                                80
    11                                                                                                                                                                                58
    12                                                                                                                                                                                86
        NA  NA NA NA NA NA NA  NA  NA NA  NA NA
    1   63  78 87 68 67 33 57  67  87 96  77 41
    2  123 100 71 70 50 77 67  93  33 44  35 36
    3   93  84 68 56 79 44 41  41 129 40 132 38
    4   43  51 62 63 59 50 58 109  70 82  66 27
    5  105  91 65 79 51 70 49  67  40 56  34 36
    6   69  71 89 66 55 68 83  51  39 67  34 44
    7   53  61 46 59 53 76 53  80  39 65  32 30
    8   55  55 52 61 63 48 85  70  57 97  60 32
    9   66  68 71 72 71 47 52  57  89 61  94 48
    10  61  55 60 56 52 56 39  60  37 39  33 65
    11  69  66 56 56 40 63 69  68  27 65  27 69
    12  70  66 59 61 46 73 62  72  47 86 113 63

person Andrew Colin    schedule 08.04.2018    source источник


Ответы (1)


Похоже, может быть две проблемы. Во-первых, я предполагаю, что имена столбцов определены в «брендах» в пользовательском интерфейсе. В этом примере название закомментировано, но я создал минимальный пример, который, как мне кажется, воссоздает то, что вы видите.

1) Определение «брендов» в виде строки, разделенной запятыми, в качестве запросов textInput.

brands<- "b1,b2,b3"

2) Другая проблема, похоже, что переменная "имена" не определяется? Возможно, это из-за комментирования. Я полагаю, это должны быть «имена‹ - входные $ бренды ». Здесь, вне блестящей среды:

names <- brands

3) Воссоздание процесса с минимальными данными. Кадр 'x'

x<-data.frame(a=c(1,2,3),b=c(1,2,3),c=c(4,3,2))
pmd.matrix <- matrix(colSums(x),byrow=T,nrow=1)
pmd.df2 <- as.data.frame(pmd.matrix)

colnames(pmd.df2) <- names
pmd.df2

Вывод pmd.df2 показывает, что первый столбец назван, а другие - NA, как в вашем примере.

> pmd.df2 b1,b2,b3 NA NA 1 6 6 9

Причина в том, что input $ names является строковой переменной и поэтому здесь только одно значение. Его нужно разделить. Ниже используется strsplit (), который вернет объект list (), который может быть unlist (), чтобы вернуть вектор объектов для имени, со следующим исправлением:

names <- unlist(strsplit(brands,","))
colnames(pmd.df2) <- names
pmd.df2

И возвращающий результат именованных столбцов:

> pmd.df2 b1 b2 b3 1 6 6 9

person Soren    schedule 08.04.2018
comment
Это потрясающе, большое спасибо, Сорен! Это работает. Между прочим, извиняюсь за комментарий, я сделал это на этапе отладки, чтобы проверить, все ли работает. Теперь это работает отлично. Похоже, моей самой большой проблемой было исключение из списка. Я очень ценю это! - person Andrew Colin; 09.04.2018
comment
Еще один вопрос, если вы знаете ответ. Приложение теперь отлично работает при локальном запуске, хотя по какой-то причине график не отображается при запуске на shinyapps.io. Вы знаете, почему он не появляется при запуске, но появляется локально? - person Andrew Colin; 09.04.2018
comment
Андрей, здорово, что приложение развивается! Существует множество причин, по которым проблема локального и удаленного доступа возникает по многим причинам. В RStudio есть несколько статей, например эта: support.rstudio.com/hc/en-us/articles/ здесь освещаются проблемы, связанные с именами файлов, которые могут быть здесь в вашем случае . Похоже, вы берете имя файла из ввода здесь: x ‹- read.csv (input $ data $ datapath, header = F), а путь входного файла может не совпадать с путем к удаленному файлу. Это хорошая отправная точка для проверки правильности загрузки данных. - person Soren; 09.04.2018
comment
Хммм ... Я проверил свои журналы на блестящем, и похоже, что CSV загружается нормально, так как я вижу, что он без проблем создает фрейм данных для построения графика. Однако похоже, что сюжет останавливается. У меня загружены все пакеты, поэтому я предполагаю, что, возможно, это потому, что я рисую в рамках процесса наблюдения, который, как я знаю, не является лучшей практикой. Я собираюсь исследовать это еще немного и опубликую обновление! - person Andrew Colin; 09.04.2018
comment
Это вполне вероятно, потому что он не выходит из renderPlot (), который будет включать в себя различные функции HTML для его поддержки. В целом вам следует подумать о перемещении фрейма данных в reactiveVal или reactiveValues. В качестве альтернативы, вместо наблюденияEvent () вы можете рассмотреть 'K ‹- eventReactive (input $ ... {(...}) и вещи управления данными. И тогда eventReactive вернет функцию реактивного значения K (), которая выводит $ plot может прослушивать в и просто вернуться с выводом $ plot ‹- renderPlot ({K ()}) - person Soren; 09.04.2018
comment
Хм. Я переделал вещи, и это все равно не сработает. Я попытаюсь сохранить его как файл изображения в моей папке WWW, а затем ссылаться на него с помощью тегов $ img. В любом случае, я ухожу слишком далеко от первоначального запроса, поэтому я закрою его здесь, но большое спасибо за вашу помощь во всем, Сорен! Мое приложение теперь почти идеально! - person Andrew Colin; 10.04.2018