在 Reactable 中使用 JavaScript 函数的最佳做法是什么?

What would be the best practice to use JavaScript function in reactable?

在 Reactable 中可以使用 JavaScript 函数,例如 example:

reactable(iris, columns = list(
  Species = colDef(
    cell = JS("function(cellInfo) {
      return '<b>' + cellInfo.value + '</b>'
    }")
  )
))

但是,我在文档中看到的所有示例都使用传递给 JS() 函数的字符串。我觉得考虑到可读性和方便性,还是把JS函数放在单独的.js文件里比较好。是真的吗?如果是,如何实现?我的意思是 - 那么如何调用这个函数?基于上面的例子。

您可以创建一个单独的文件 (script.js),然后使用 readLines():

读入您的 JavaScript

script.js

function(cellInfo) {
      return '<b>' + cellInfo.value + '</b>'
}

reactable.r

library(reactable)

js <- readLines('script.js')

reactable(iris, columns = list(
  Species = colDef(
    cell = JS(js)
  )
))

在 R 中将 JavaScript 写为内联字符串总是令人讨厌,但我认为当您有一个仅用于 [=72] 的简短 one-off 函数时,这是有意义的=].并置逻辑也有助于提高可读性,因为您不必跳到不同的文件。代码完全 self-contained,因此您可以轻松更改或移动它。

话虽如此,我确实更喜欢将 JavaScript 移动到外部 .js 文件,当它变得更大更复杂时,and/or 当它必须在多个地方重复使用时.使用外部文件,您可以获得正确的语法检查和突出显示、linting、auto-formatting、编写测试的机会,并且免于可怕的字符串转义问题。

R 降价

对于 R Markdown 文档,您可以使用 js 语言块来包含外部脚本(用于选择性地显示带有 echo=TRUE 的实际 JS 代码):

```{js, file='script.js', echo=FALSE}
```

注意:此示例假设 script.js 与 R Markdown 文档位于同一目录中,因此将其更改为 path/to/somewhere-else/script.js 以获取不同的位置。

您还可以使用 <script> HTML 标签将脚本包含在文档中:

<script src="script.js"></script>

这个 HTML 直接在文档中,在任何代码块之外。 R Markdown 理解 <script> 标签并将脚本的内容嵌入呈现的 HTML 文档中。

闪亮

对于 Shiny 应用程序,您有更多选择,我将参考 Packaging JavaScript code for Shiny 上的文章以获取每个选项的详细摘要。

R 脚本

R 脚本更棘手,这取决于您 运行 代码的来源 - 是来自 RStudio IDE,还是来自命令行的 R,或 RGui?

RStudio IDE 查看器提供从本地 Web 服务器呈现的 HTML,这意味着浏览器安全功能可能会阻止您直接包含来自本地文件系统的 <script> 文件。

相反,包含外部脚本的更强大的方法是使用 htmltools::htmlDependency(),因此外部脚本在 RStudio IDE 和其他任何地方都有效:

library(reactable)
library(htmltools)

html <- browsable(tagList(
  htmlDependency(
    # name and version: doesn't really matter, can be anything
    "my-script", "0.1.0",
    # src: path to directory containing the script (e.g., the current directory '.')
    src = normalizePath("."),
    # script: filename of script to include
    script = "script.js",
    # Exclude all other files in src directory
    all_files = FALSE
  ),

  reactable(...)
))

# View it directly from an R console
html

# Or save it to an HTML file
save_html(html, "table.html")

这还假定 script.js 在当前 运行 目录中,因此如果需要,请将 src 更改为脚本所在的位置。

而且,我也喜欢 Matt 关于将外部脚本读入 R 的回答。它很简单,而且在大多数情况下可能效果很好。

如果您采用 htmlDependency() 方法,您可能会获得额外的好处,例如在文档中多次包含脚本时自动删除重复的脚本。如果您在多个 table 中重复使用该脚本或编写一个生成具有 JavaScript 依赖项的 table 的包,它会更好地工作。