Как я могу получить dict от запроса sqlite?

Я избегаю использовать renderImage для такого рода вещей. В прошлом я сам некоторое время боролся с этой функцией (она отлично подходит для графиков, но не для реальных png, jpeg, gif и т. Д., Кажется), поэтому здесь есть рабочая альтернатива, использующая тег html img () в качестве объекта вывода renderUI. Кажется, твой javascript работает нормально. Кроме того, вы можете просто использовать интерактивное изображение, которое, как мне кажется, работает лучше, чем локально сохраненное

library(shiny)
library(shinyjs)

jsCode <- '
shinyjs.reset_anim = function() {
  var div_elem = document.getElementById("anim_plot");
  var img_elem = div_elem.getElementsByTagName("img")[0];
  var src_value = img_elem.getAttribute("src");
  img_elem.setAttribute("src", "");
  img_elem.setAttribute("src", src_value);
}
'


# Define UI ----
ui <- fluidPage(useShinyjs(),
                extendShinyjs(text = jsCode),
                uiOutput('anim_plot'),
                fluidRow(
                  column(3,  
                         actionButton("do_again", "Again")
                  )
                )
)

# Define server logic ----
server <- function(input, output) {
  output$anim_plot <- renderUI({
    img(src='https://uc290691998b0891615b1f3e9397.previews.dropboxusercontent.com/p/orig/AAae6QYO7VLEEUVYdUuL985gwFGGVQ_RJ0mjLtfJt0bk3UO1ThezW4YO7R5LUzN9_m6moBjubhfX2AAnYmEkwDEjnwIw1gLOWUrOw4q_pKYYtXW-JCgghu4NuCgPKCm3RXxt3rNULvlUg-cP_Oj2vnItglJchP6a6a_lyApxTdZHwPk4Yv6jWxiYANVdFAVKxiTeHWVC5J3PYDeW8yOnaj4VGDj92eJCIXYtjpmznffo0tPUdUovNJMMW5nzsgT0L38w_5h39bcBxIwoCBmZ95iC8SRd9BGHxJMGCM4HUVh_Ly0VW3lwBxUx3O__VD5Ind-lahJwVkZjmet-HzP6XnUB/p.gif?size_mode=5', align = "right")
  })

  observeEvent(input$do_again, {
    js$reset_anim()

  })
}

shinyApp(ui = ui, server = server)  

ОБНОВЛЕНИЕ:
Приложение с файлом на сервере, файл пользовательского интерфейса и 5 картинок в папке www: я только что скачал 5 случайных картинок из giphy и сделал один, чтобы не зацикливаться с ezgif.com , сохранил их как gif1.gif, gif2.gif и т. д.

@OP: Имейте в виду, что ваш JavaScript нацелен на 1 конкретный объект GIF. Если вы хотите перезагрузить другой gif, вам придется переписать свой javascript, чтобы получить входной аргумент, который будет именем вашего anim_plot n, который вы хотите перезапустить, я думаю. Я не эксперт по javascript, поэтому я не буду пытаться добавить это здесь, но если вы это сделаете, не стесняйтесь добавлять это к информации здесь

p.s. 1: не ставьте www / в аргументе src. Shiny автоматически заглядывает в папку www. .

ps 2: имейте в виду, что некоторые вещи не работают во внутреннем интерфейсе RStudio, и настройте его для внешнего запуска приложений, нажав кнопку «Run external» под крошечным меню стрелки, которое находится на справа от кнопки воспроизведения «Запустить приложение».

# File of the server.
server <- function(input, output) {

  lapply(1:5, function(image_id) { 
  output[[paste('anim_plot', image_id, sep = '')]] <- renderUI({
    img(src=paste('gif', image_id, '.gif', sep = ''), align = "right")

    })
  })

  observeEvent(input$do_again, {
    js$reset_anim()

  })
}


# File of UI ----
library(shiny)
library(shinyjs)

jsCode <- '
shinyjs.reset_anim = function(anim_plot2) {
  var div_elem = document.getElementById("anim_plot2");
  var img_elem = div_elem.getElementsByTagName("img")[0];
  var src_value = img_elem.getAttribute("src");
  img_elem.setAttribute("src", "");
  img_elem.setAttribute("src", src_value);
}
'


ui <- fluidPage(useShinyjs(),
                extendShinyjs(text = jsCode),
                uiOutput('anim_plot1'),
                uiOutput('anim_plot2'),
                uiOutput('anim_plot3'),
                uiOutput('anim_plot4'),
                uiOutput('anim_plot5'),

                fluidRow(
                  column(3,  
                         actionButton("do_again", "Again")
                  )
                )
)

screenshot

98
задан dreftymac 13 December 2017 в 21:12
поделиться

3 ответа

Вы можете использовать row_factory, как в примере в документации:

import sqlite3

def dict_factory(cursor, row):
    d = {}
    for idx, col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d

con = sqlite3.connect(":memory:")
con.row_factory = dict_factory
cur = con.cursor()
cur.execute("select 1 as a")
print cur.fetchone()["a"]

или последовать совету, который дан сразу после этого примера в документации:

Если возврата кортежа недостаточно и вы хотите получить доступ к столбцам, вы должны рассмотреть возможность установки row_factory на высокооптимизированный sqlite3.Row. Row обеспечивает как основанный на индексах и нечувствительный к регистру доступ к столбцам на основе имен с почти без затрат памяти. Это будет вероятно, будет лучше, чем ваш собственный пользовательский подход на основе словарей или даже решение на основе db_row.

141
ответ дан 24 November 2019 в 05:13
поделиться

Как упомянуто ответом @gandalf, нужно использовать conn.row_factory = sqlite3.Row, но результаты не непосредственно словари. Нужно добавить дополнительный "бросок" к dict в последнем цикле:

import sqlite3
conn = sqlite3.connect(":memory:")
conn.execute('create table t (a text, b text, c text)')
conn.execute('insert into t values ("aaa", "bbb", "ccc")')
conn.execute('insert into t values ("AAA", "BBB", "CCC")')
conn.row_factory = sqlite3.Row
c = conn.cursor()
c.execute('select * from t')
for r in c.fetchall():
    print(dict(r))

# {'a': 'aaa', 'b': 'bbb', 'c': 'ccc'}
# {'a': 'AAA', 'b': 'BBB', 'c': 'CCC'}
0
ответ дан 24 November 2019 в 05:13
поделиться

Из PEP 249 :

Question: 

   How can I construct a dictionary out of the tuples returned by
   .fetch*():

Answer:

   There are several existing tools available which provide
   helpers for this task. Most of them use the approach of using
   the column names defined in the cursor attribute .description
   as basis for the keys in the row dictionary.

   Note that the reason for not extending the DB API specification
   to also support dictionary return values for the .fetch*()
   methods is that this approach has several drawbacks:

   * Some databases don't support case-sensitive column names or
     auto-convert them to all lowercase or all uppercase
     characters.

   * Columns in the result set which are generated by the query
     (e.g.  using SQL functions) don't map to table column names
     and databases usually generate names for these columns in a
     very database specific way.

   As a result, accessing the columns through dictionary keys
   varies between databases and makes writing portable code
   impossible.

Так что да, сделайте это самостоятельно.

8
ответ дан 24 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: