Shinydashboard:Google 地点自动完成。 InvalidValueError:不是 HTMLInputElement 的实例

2024-03-28

我想放一个shinydashboard在一起,并有一个 Google Places 搜索框作为文本输入。下面的代码以常规方式运行shiny页面,但抛出一个InvalidValueError: not an instance of HTMLInputElement放入时出错shinydashboard。 (见下图)

我不确定为什么它会在常规情况下工作shiny应用程序但是not里面一个shinydashboard.

Screenshot of error: enter image description here

最小可重现代码示例:

Note: 首先插入您的 Google API 密钥

library(shiny)
library(googleway)
library(shinydashboard)

#key <- "MyKey"
#set_key(key = key)
#google_keys()


ui<- shinydashboard::dashboardPage(
  dashboardHeader(title = "Look @ Console"),
  dashboardSidebar(list(sidebarMenuOutput("sideBar_menu_UI"))), 
  dashboardBody(
    HTML(paste0(" <script> 
                 function initAutocomplete() {

                var autocomplete = new google.maps.places.Autocomplete(document.getElementById('my_address'),{types: ['geocode']});
                autocomplete.setFields(['address_components', 'formatted_address',  'geometry', 'icon', 'name']);
                autocomplete.addListener('place_changed', function() {
                var place = autocomplete.getPlace();
                if (!place.geometry) {
                return;
                }

                var addressPretty = place.formatted_address;
                var address = '';
                if (place.address_components) {
                address = [
                (place.address_components[0] && place.address_components[0].short_name || ''),
                (place.address_components[1] && place.address_components[1].short_name || ''),
                (place.address_components[2] && place.address_components[2].short_name || ''),
                (place.address_components[3] && place.address_components[3].short_name || ''),
                (place.address_components[4] && place.address_components[4].short_name || ''),
                (place.address_components[5] && place.address_components[5].short_name || ''),
                (place.address_components[6] && place.address_components[6].short_name || ''),
                (place.address_components[7] && place.address_components[7].short_name || '')
                ].join(' ');
                }
                var address_number =''
                address_number = [(place.address_components[0] && place.address_components[0].short_name || '')]
                var coords = place.geometry.location;
                //console.log(address);
                Shiny.onInputChange('jsValue', address);
                Shiny.onInputChange('jsValueAddressNumber', address_number);
                Shiny.onInputChange('jsValuePretty', addressPretty);
                Shiny.onInputChange('jsValueCoords', coords);});}
                </script> 
                <script src='https://maps.googleapis.com/maps/api/js?key=", key,"&libraries=places&callback=initAutocomplete' async defer></script>"))
    ,uiOutput("tabContentUI")
  )
)



server <- function(input, output) {

  output$sideBar_menu_UI <- renderMenu({
    sidebarMenu(id = "sideBar_Menu",

                menuItem("Data Import", tabName="datatab", icon = icon("database")),
                conditionalPanel("input.sideBar_Menu=='datatab'", 
                                 shiny::radioButtons(inputId = "upload_custom_data", label = "Do You Want To Upload Your Own Data?",
                                                     choices  = c("Yes"=TRUE, "No"=FALSE), selected = FALSE, inline = TRUE),
                                 shiny::uiOutput("conditionalFileInputUI")),
                menuItem("AnotherMenu", tabName = "anotherMenu", icon = icon("list-ol")))
  }) 

  output$conditionalFileInputUI<- shiny::renderUI({
    if(input$upload_custom_data == TRUE){}
    if(input$upload_custom_data == FALSE){
      list(
        shiny::textInput(inputId = "my_address", label = "Search For Address", width = "350px"),
        shiny::actionButton(inputId = "add_btn", label = "Add To Dataset", icon = icon("plus"))
      )

    }
  })

  ### Output$Stuff Here
  output$anotherMenu_content<- shiny::renderText({"This is some text" })
  output$datatab_content<- shiny::renderUI({ list(shiny::uiOutput("full_address"), shiny::uiOutput("my_map")) })

  #### Tab Content UI Materials
  output$tabContentUI<- shiny::renderUI({
    shinydashboard::tabItems(
      shinydashboard::tabItem(tabName = "datatab", shiny::uiOutput("datatab_content")), 
      shinydashboard::tabItem(tabName = "anotherMenu", shiny::textOutput("anotherMenu_content"))
    )
  })

  my_address <- reactive({
    if(!is.null(input$jsValueAddressNumber)){
      if(length(grep(pattern = input$jsValueAddressNumber, x = input$jsValuePretty ))==0){
        final_address<- c(input$jsValueAddressNumber, input$jsValuePretty)
      } else{
        final_address<- input$jsValuePretty
      }
      final_address
    }
  })

  output$full_address <- renderText({
    if(!is.null(my_address())){
      paste0("The Fuller and Fixed Address is... ", my_address())
    }
  })

  output$my_map <- renderGoogle_map({
    my_address <- my_address()
    shiny::validate(
      need(my_address, "Address not available")
    )

    gdat <- google_geocode(address = my_address)
    my_coords <- geocode_coordinates(gdat)
    my_coords <- c(my_coords$lat[1], my_coords$lng[1])

    google_map(
      location = my_coords,
      zoom = 12,
      map_type_control = FALSE,
      zoom_control = FALSE,
      street_view_control = FALSE
    )
  })

}

shinyApp(ui, server)

我很想知道是否有人知道如何解决这个问题?我很感激任何反馈。先感谢您。

--nate

Update:

我还没有解决这个问题。但是,通过反复试验,我注意到如果我将“搜索地址”输入从server.R文件并放入原始文件HTML在用户界面部分。

将此代码放入 UI 中可以得到部分解决方案......(对格式表示歉意)

  shinydashboard::dashboardSidebar(width = "400px",


list(shinydashboard::sidebarMenuOutput(outputId = "sideBar_menu_UI"),


 HTML('<div class="form-group shiny-input-container"> <label for="my_address">Type An Address</label> <input id="my_address" type="text" class="form-control" value=""/> </div>'))),

The Updated UI now looks like this: Getting Closer Screenshot


我能够做到这一点的唯一方法是将渲染 sidebarMenu 背后的所有逻辑从server.R文件并将其放入ui.R file.

最终的工作解决方案是这样的:

library(shiny)
library(googleway)
library(shinydashboard)

#key <- "MyKey"
#set_key(key = mygoogleapikey)
#google_keys()


ui<- shinydashboard::dashboardPage(
  dashboardHeader(title = "This Works"),
  dashboardSidebar(shinydashboard::sidebarMenu(id="sideBar_Menu",
                                              menuItem("Data Import", tabName="datatab", icon = icon("database")),
                                              conditionalPanel("input.sideBar_Menu=='datatab'",
                                              shiny::radioButtons(inputId = "upload_custom_data", label = "Do You Want To Upload Your Own Data?", choices  = c("Yes"=TRUE, "No"=FALSE), selected = TRUE, inline = TRUE),

                                              conditionalPanel("input.upload_custom_data == 'TRUE'",
                                                               shiny::actionButton("go", "Go")),

                                              conditionalPanel("input.upload_custom_data == 'FALSE'",
                                                               textInput(inputId = "my_address", label = "Type An Address"),
                                                               shiny::actionButton(inputId = "add_btn", label = "Add To Dataset", icon = icon("plus")))


                                               ), # with outer conditional menu
                                               menuItem("AnotherMenu", tabName = "anotherMenu", icon = icon("list-ol"))
  ) # with sidebar menu
  ),

  dashboardBody(
    HTML(paste0(" <script> 
                function initAutocomplete() {

                var autocomplete = new google.maps.places.Autocomplete(document.getElementById('my_address'),{types: ['geocode']});
                autocomplete.setFields(['address_components', 'formatted_address',  'geometry', 'icon', 'name']);
                autocomplete.addListener('place_changed', function() {
                var place = autocomplete.getPlace();
                if (!place.geometry) {
                return;
                }

                var addressPretty = place.formatted_address;
                var address = '';
                if (place.address_components) {
                address = [
                (place.address_components[0] && place.address_components[0].short_name || ''),
                (place.address_components[1] && place.address_components[1].short_name || ''),
                (place.address_components[2] && place.address_components[2].short_name || ''),
                (place.address_components[3] && place.address_components[3].short_name || ''),
                (place.address_components[4] && place.address_components[4].short_name || ''),
                (place.address_components[5] && place.address_components[5].short_name || ''),
                (place.address_components[6] && place.address_components[6].short_name || ''),
                (place.address_components[7] && place.address_components[7].short_name || '')
                ].join(' ');
                }
                var address_number =''
                address_number = [(place.address_components[0] && place.address_components[0].short_name || '')]
                var coords = place.geometry.location;
                //console.log(address);
                Shiny.onInputChange('jsValue', address);
                Shiny.onInputChange('jsValueAddressNumber', address_number);
                Shiny.onInputChange('jsValuePretty', addressPretty);
                Shiny.onInputChange('jsValueCoords', coords);});}
                </script> 
                <script src='https://maps.googleapis.com/maps/api/js?key=", key,"&libraries=places&callback=initAutocomplete' async defer></script>"))
    ,uiOutput("tabContentUI")
    )
    )



server <- function(input, output) {




  ### Output$Stuff Here
  output$anotherMenu_content<- shiny::renderText({"This is some text" })
  output$datatab_content<- shiny::renderUI({ list(shiny::uiOutput("full_address"), shiny::uiOutput("my_map")) })

  #### Tab Content UI Materials
  output$tabContentUI<- shiny::renderUI({
    shinydashboard::tabItems(
      shinydashboard::tabItem(tabName = "datatab", shiny::uiOutput("datatab_content")), 
      shinydashboard::tabItem(tabName = "anotherMenu", shiny::textOutput("anotherMenu_content"))
    )
  })

  my_address <- reactive({
    if(!is.null(input$jsValueAddressNumber)){
      if(length(grep(pattern = input$jsValueAddressNumber, x = input$jsValuePretty ))==0){
        final_address<- c(input$jsValueAddressNumber, input$jsValuePretty)
      } else{
        final_address<- input$jsValuePretty
      }
      final_address
    }
  })

  output$full_address <- renderText({
    if(!is.null(my_address())){
      paste0("The Fuller and Fixed Address is... ", my_address())
    }
  })

  output$my_map <- renderGoogle_map({
    my_address <- my_address()
    shiny::validate(
      need(my_address, "Address not available")
    )

    gdat <- google_geocode(address = my_address)
    my_coords <- geocode_coordinates(gdat)
    my_coords <- c(my_coords$lat[1], my_coords$lng[1])

    google_map(
      location = my_coords,
      zoom = 12,
      map_type_control = FALSE,
      zoom_control = FALSE,
      street_view_control = FALSE
    )
  })

}

shinyApp(ui, server)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shinydashboard:Google 地点自动完成。 InvalidValueError:不是 HTMLInputElement 的实例 的相关文章

  • 为什么 rbind 会抛出警告

    这与是否有更优雅的方法将不规则的数据转换为整洁的数据框 https stackoverflow com questions 25102617 are there more elegant ways to transform ragged d
  • 一个文本区域中的文本应复制到另一个文本区域,并且应使用 JavaScript 单击按钮清除原始文本区域

    我已经完成了以下代码 它显示两个文本区域 其中一个文本区域中的文本通过使用 javascript 单击按钮复制到另一个文本区域
  • 如何从类外部更改公共 R6 类方法?

    我希望能够在我的 R6 类中重新定义公共方法 以便它根据该类保存的数据类型进行更改 如下所示 library R6 Simple lt R6Class Simple public list dt mtcars my print functi
  • Atom“自动完成”不起作用

    因此 当您安装 Atom 时 autocomplete 会随其一起提供 并且默认情况下处于启用状态 当我编写代码时 什么也没有显示 为什么 是否需要配置任何文件才能正常工作 In autocomplete plus settings pag
  • JavaScript 中的 Promise.all:如何获取所有 Promise 的解析值?

    我编写了以下node js文件 var csv require csv parser var fs require fs var Promise require bluebird var filename devices csv var d
  • 用于更改向量中元素顺序的闪亮小部件

    在很多网站上 您都有一个拖放界面来更改列表中元素的顺序 我正在寻找类似的东西闪亮 我希望用户能够拖放列表中的元素 通过更改顺序来更改优先级 现在我有一个滥用的解决方案selectizeInput 这是可行的 但当选择列表变得更大时 它很快就
  • Angular 2 最终版本路由器单元测试

    如何使用 karma 和 jasmine 对 Angular 2 0 0 版中的路由器进行单元测试 这是我的旧单元测试在版本 2 0 0 beta 14 中的样子 import it inject injectAsync beforeEac
  • 按自定义字母顺序对数组进行排序

    如何对这样的数组进行排序 apple very auto tom tim violet 要按 v a t x b 等排序 不按字母顺序 violet very auto tom tim 在脚本中 我会做这样的事情 myArray sort
  • 在 NPM 上捆绑并发布客户端 Web 代码

    我制作了一个 JavaScript 文件 假设它的内容是这样的 let myCoolAlert str gt alert str in a different js file SO doesn t allow you to cross fi
  • 避免 AngularJS 部分视图在 IE 中缓存

    我正在开发一个 ASP NET MVC 应用程序 它也有一些 angularJS 我有一个主页 其中有不同的选项卡 当您单击它们时 它们会加载角度部分视图 主页是这样的 div class widget div div class widg
  • Firefox OS 后台服务

    我想构建一个应用程序 用户可以通过它输入一些设置 并且应用程序将启动后台服务来根据这些设置执行一些任务 我只想在模拟器中运行应用程序和后台服务 我知道它需要 认证 模式才能运行后台服务 但我现在不考虑在 Firefox Marketplac
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • JavaScript - 这个这个

    String prototype foo String prototype foo bar function How can you reference the grandparent string console log this par
  • 为什么严格模式下不允许使用八进制数字文字(解决方法是什么?)

    为什么八进制数字文字不允许JavaScript 严格模式 https developer mozilla org en docs Web JavaScript Reference Strict mode 有什么害处呢 use strict
  • CKEditor TypeError:c[a] 在 CodeIgniter 中未定义

    我正在尝试在基于 codeigniter 的网站中安装 CKEditor 并且我已按照本教程进行操作 Codeigniter 教程中的 CKEditor http nukium com developpement php framework
  • 可选链接在 create-react-app 中不起作用

    In a create react app项目 我正在使用 babel plugin proposal optional chaining在我的 babelrc中 但是 我有这个错误 Module parse failed Unexpect
  • 在多面图中用 N 注释 x 轴

    我正在尝试生成一些按治疗条件和访问次数细分的数字结果的箱线图 每个框中的观察次数都放在图下方 并且也标记了访问次数 这里有一些虚假数据可以用来说明 我举了两个我尝试过但不太有效的例子 library ggplot2 library plyr
  • 为 ggplot 定义新的尺度轴变换

    我正在尝试创建一个squared使用 y 轴变换scales trans new但遇到错误 MWE data data frame x 1 10 y runif 10 z rnorm 10 10 library ggplot2 ggplot
  • JavaScript 右移负数

    这是片段 var i 101 console log 101 i toString 2 console log 101 gt gt 1 i gt gt 1 toString 2 var l 101 console log 101 l toS
  • Javascript:修改原型不会影响现有实例[重复]

    这个问题在这里已经有答案了 我创建了原型的 2 个实例 更改了原型中的函数 更改反映在两个实例中 很棒 但是 当我通过删除该函数来修改原型时 该函数对于现有实例仍然存在 function A this name cool A prototy

随机推荐

  • 如何比较 python 函数的性能? [复制]

    这个问题在这里已经有答案了 我已经编写了两个函数来做完全相同的事情 但我不知道哪个更快更好 我如何比较这两个函数 看看哪一个在性能和其他方面更好 The timeit http docs python org library timeit
  • 如何保留 Spark HashingTF() 函数输入的键或索引?

    基于 1 4 的 Spark 文档 https spark apache org docs 1 4 0 mllib feature extraction html https spark apache org docs 1 4 0 mlli
  • 计算向量中所有差异的可能性

    假设我有一个短向量x a b c d e 计算向量成员之间的所有差异的最佳方法是什么 y e d e c e b e a d e d c d b d a c e c d c b c a b e b d b c b a a e a d a c
  • 您可以为 SQL 2008 查询设置默认架构吗

    我有一个名为应用程序的模式 有没有一种方法 而不是使用语法 SELECT FROM application table 我可以设置默认架构 以便我可以使用 SELECT FROM table 我想这与 using 语句的想法相同 所有 sq
  • ejabberd MAM 不适用于 MUC

    xep 0313 适用于名册 但不适用于房间聊天 我可以获取名册的存档消息 但无法获取房间的存档消息 为什么
  • 使用 scipy 应用 Sobel 过滤器

    我正在尝试在图像上应用 Sobel 滤波器以使用 scipy 检测边缘 我在 Windows 7 Ultimate 64 位 上使用 Python 3 2 64 位 和 scipy 0 9 0 目前我的代码如下 import scipy f
  • 空白而不是零

    Duration isnull FunctionA DateA DateB 上面的函数计算天数 如果 day 为空 则显示 值 0 而不是空白值 如何更改上面的代码 使其显示空白而不是 0 值 null 如果您的函数返回一个整数 则结果来自
  • Reflect.getMetadata 在 Angular2 中不起作用

    我用过这个 Reflect getMetadata annotations AppComponent 0 template 在 plunker 中它工作得很好http plnkr co edit f47uORghJXaq0FtD00Th p
  • asp.net Base-64 字符串中的无效字符

    我有一个 C 移动网站 并且在使用某些移动客户端时遇到问题 我在下面发布了一条跟踪 但基本上是手机浏览器或手机连接到互联网 url 的 wap 网关对表单中的视图状态隐藏输入进行编码 wEPDwULLTExNTMyOTcwOTBkGAEFB
  • 在 ASP Web API 中指定无效参数时返回错误

    我正在使用 C 和 ASP NET Web API 创建一个 API 并且希望它在使用无法识别的参数时返回错误 例如 api Events 应该有一个事件列表 api Events startTime startTime 应该返回在特定时间
  • “wordlist”的非数字第二个参数

    我正在 Eclipse android 中构建一个 c 项目并收到以下错误 这是 ndk 构建错误 与我的代码无关 Users eladb MyWorkspace android ndk r8e build gmsl gmsl 512 no
  • 获取pandas数据框中子节点的所有直接中间和最终父节点

    我的数据框具有父子关系 如下所示 child Parent relationship A1x2 bc11 direct parent bc11 Aw00 direct parent bc11 Aw00 ultimate parent Aee
  • 将 Flask 表单值转换为 int

    我有一个表格 其中发布了personIdint 到 Flask 然而 request form personId 返回一个字符串 为什么 Flask 不给我一个 int 我尝试将其转换为 int 但下面的路线返回 400 或 500 错误
  • jQuery 选择器上下文问题

    我试图做出以下选择 program row 其中 row 是包含两个表行的 jQuery 对象 其中一个 tr 具有 program 类 该选择器似乎没有找到它 但是以下方法有效 title row 其中 div title 是 tr pr
  • 使用CSS的圆形文本段落[重复]

    这个问题在这里已经有答案了 我一直在寻找一个关于如何将一段文本放置在圆圈内的体面且快速的解决方案 我发现有两种解决方案 解决方案1 浮动倍数div与文本左侧和右侧的文本高度相同 并通过更改 divwidth您可以调整文本的剩余空间 解决方案
  • SpriteKit和粒子碰撞

    我有一个粒子发射器 我想在粒子碰撞某些物理体时检测到它 SpriteKit API 中是否有本地方法可以做到这一点 或者我是否需要 作弊 单个粒子不能碰撞 不是用物理学 也不是任何其他方式 您甚至无法获得有关单个粒子的任何信息 您无法访问它
  • 2个脚本(FitVids.js、Vimeo.js)一起kill调用函数播放视频,导致:VimeoAPI不是函数

    Update以下 好吧 我这里遇到了问题 我使用这个优秀的 vimeo 类来让我的生活更轻松 http www josh ho com vimeo class http www josh ho com vimeo class 源代码在这里
  • GitHub Actions:在可重用工作流程中引用环境机密

    我已经能够在可重用工作流程中传递和引用组织和存储库机密 没有任何问题 问题 错误 是环境特定的秘密没有被传递 我尝试明确并列出所有这些并使用 秘密 继承 如果我使用 秘密 继承 我不必显式列出任何秘密 但是 引用时环境秘密为空 将它们全部列
  • 带有静态单元格的 UITableView 不会出现

    我使用 Storyboards 选项卡视图模板 创建了一个新的 Xcode 项目 我在故事板中添加了几个视图控制器 并希望使用带有静态单元格的 UITableView 我创建了它 但是当我在模拟器中运行时 单元格不会出现 除了这个故事板文件
  • Shinydashboard:Google 地点自动完成。 InvalidValueError:不是 HTMLInputElement 的实例

    我想放一个shinydashboard在一起 并有一个 Google Places 搜索框作为文本输入 下面的代码以常规方式运行shiny页面 但抛出一个InvalidValueError not an instance of HTMLIn