gpt4 book ai didi

javascript - 使用 htmlwidgets::scaffoldWidget 将外部 js 库合并为一个新包以进入 Shiny 的应用程序

转载 作者:数据小太阳 更新时间:2023-10-29 04:47:25 26 4
gpt4 key购买 nike

我对 slick javascript 库 ( http://kenwheeler.github.io/slick/ ) 印象深刻,并想将其合并到我 Shiny 的应用程序/flexboard 页面中。

我想在 R 中使用 htmlwidgets 包并合并 slick js 库,因此开始尝试按照在线文档 (http://www.htmlwidgets.org/develop_intro.html) 中的建议创建一个包,通过携带出以下...

devtools::create("slick")              
setwd("slick")
htmlwidgets::scaffoldWidget("slick")

我从https://github.com/kenwheeler/slick/archive/1.6.0.zip下载了js库

并将其放入包的结构中,这样我就有了一个看起来有点像这样的文件结构。

R/
| slick.R

inst/
|-- htmlwidgets/
| |-- slick.js
| |-- slick.yaml
| |-- lib/
| | |-- slick-1.6.0/
| | | |-- slick/
| | | | |-- slick.min.js
| | | | |-- slick.js
| | | | |-- slick.css
| | | | |-- slick-theme.css

我的 slick.yaml 文件看起来像这样......

dependencies:
- name: slick
version: 1.6.0
src: htmlwidgets/lib/slick-1.6.0
script:
- slick/slick.min.js
- slick/slick.js
stylesheet:
- slick/slick.css
- slick/slick-theme.css

但是对于如何调整 inst/htmlwidget/slick.js 文件和 R/slick.R 文件我真的很困惑网址矢量并将它们显示在 Shiny 的应用程序中。这样做的原因是它似乎与提供的示例中的输入数据概念不匹配。

为了可重复性并使用包中示例中提供的相同 URL,我提供了一个占位符 img URL 向量,我想将其用作内容。对于轮播中的每张图片。

image_vec <- paste0("http://placehold.it/350x300?text=",seq(1:9))

也许我可能需要使用这样的东西?...

lapply(image_vec,function(y){div(img(src=y))})

一如既往,我们将不胜感激。

编辑

我的新 slick.yaml 文件如下所示...在@NicE 的回答后...我是否遗漏了什么?

dependencies:
- name: jquery
version: 3.1.0
src: htmlwidgets/lib
script:
- jquery-3.1.0.min.js
- name: slick
version: 1.6.0
src: htmlwidgets/lib/slick-1.6.0
script:
- slick/slick.min.js
- slick/slick.js
stylesheet:
- slick/slick.css
- slick/slick-theme.css

现在我的文件结构如下所示:

R/
| slick.R

inst/
|-- htmlwidgets/
| |-- slick.js
| |-- slick.yaml
| |-- lib/
| | |-- jquery-3.1.0.min.js
| | |-- slick-1.6.0/
| | | |-- slick/
| | | | |-- slick.min.js
| | | | |-- slick.js
| | | | |-- slick.css
| | | | |-- slick-theme.css

我的 /inst/htmlwidgets/slick.js 看起来像下面这样

HTMLWidgets.widget({

name: 'slick',

type: 'output',

factory: function(el, width, height) {

// TODO: define shared variables for this instance
// create new slick object witht the given id?
var sl = new slick(el.id);



return {

renderValue: function(x) {
//add class to the div and center it
el.setAttribute("class",x.class);
el.style.margin = "auto";

//add images to the div
content='';
for(var image in x.message)
{
content += '<div><img src="' + x.message[image] + '"/></div>';
}
el.innerHTML = content;

//initialize the slider.
$(document).ready(function(){
$("."+x.class).slick(x.options);
});

},

resize: function(width, height) {

// TODO: code to re-render the widget with a new size

}

};
}
});

最佳答案

这是一个尝试,使用 htmlwidgets_0.6:

对于依赖项,yaml 文件看起来是一样的,我只是在 slick 上面添加了 jQuery:

dependencies:
- name: jquery
version: 3.1.0
src: htmlwidgets/lib
script:
- jquery-3.1.0.min.js
- name: slick ...

可以得到here并将其放入 lib 文件夹中。

slick.R文件中,需要改变slick函数的参数来添加选项,改变x来转发所有JS 代码的参数:

slick <- function(message, class="slick_slider", options = list(), width = NULL, height = NULL) {

# forward options using x
x = list(
message = message,
class = class,
options = options
)
...

slick.js中,主要需要修改renderValue,将图片/内容添加到div中,并显示轮播:

renderValue: function(x) {
//add class to the div and center it
el.setAttribute("class",x.class)
el.style.margin = "auto";

//add images to the div
content='';
for(var image in x.message)
{
content += '<div><img src="' + x.message[image] + '"/></div>';
}
el.innerHTML = content;

//initialize the slider.
$(document).ready(function(){
$("."+x.class).slick(x.options);
});

}

使用 devtools::install() 安装后,您可以在 shiny 应用中使用它:

library(shiny)
library(htmlwidgets)
library(slick)

server <- function(input, output) {
output$test_slick <- renderSlick({
slick(paste0("http://placehold.it/350x300?text=",1:9),
options=list(dots=TRUE,autoplay=TRUE))
})
}

ui <- fluidPage(
tags$style(HTML("body {background-color: #2682d5}")),
slickOutput('test_slick',width="350px",height="300px")
)

shinyApp(ui = ui, server = server)

关于javascript - 使用 htmlwidgets::scaffoldWidget 将外部 js 库合并为一个新包以进入 Shiny 的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38563958/

26 4 0
文章推荐: c# - 如何在 C# 中将 List 转换为 Hashtable?