Внешний js для математического режима в блестящих таблицах

Этот вопрос связан с Вот этот.

РЕДАКТИРОВАТЬ

Я переформулировал вопрос, чтобы воспроизвести проблему в более сложном приложении.

Я пытаюсь включить математический режим в таблицы. Решение @Stéphane Laurent с использованием katex в EDIT 2 отлично работает. Я отредактировал код, так как мое приложение включает в себя множество таблиц с именами, включающими строку coef_.

library(shiny)

js <- " 
$(document).on('shiny:value', function(event) {
if (event.name.indexOf(event.name.match(/\\b\\w*coef_\\w+\\b/g)) > -1){
if (event.value.match(/(%%+[^%]+%%)/g) !== null) {
var matches = event.value.match(/(%%+[^%]+%%)/g);
var newvalue = event.value;
for(var i=0; i<matches.length; i++){
var code = '\\\\' + matches[i].slice(2,-2);
newvalue = newvalue.replace(matches[i], katex.renderToString(code));
}
event.value = newvalue;
} else {
event.value;
}
}
});
" 

В случае, если имя этой таблицы не включает строку coef_ или n в случае, если таблица с именем, включающим строку coef_, не включает термины с %%, js не должно влиять на нее.

# UI 1
fluidPage(
  tags$head(
    tags$link(rel = "stylesheet", href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css", integrity = "sha384-9tPv11A+glH/on/wEu99NVwDPwkMQESOocs/ZGXPoIiLE8MU/qkqUcZ3zzL+6DuH", crossorigin = "anonymous"),
    tags$script(src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js", integrity = "sha384-U8Vrjwb8fuHMt6ewaCy8uqeUXv4oitYACKdB0VziCerzt011iQ/0TqlSlv8MReCm", crossorigin = "anonymous"),
    tags$script(HTML(js))
  ),
  titlePanel("Hello Shiny!"),
  mainPanel(
    numericInput("mean", "Enter mean", value = 1),
    tableOutput("coef_table1"),
    tableOutput("coef_table2"),
    tableOutput("table")
  ))

# SERVER
server <- function(input, output) {

  output$table <- renderTable({
    x <- rnorm(2)
    y <- rnorm(2, input$mean)
    tab <- data.frame(x = x, y = y, z = c("hello", "%%gamma%%%%delta%%"))
    rownames(tab) <- c("%%alpha%%", "%%beta%%")
    tab
  }, rownames = TRUE)

}

Внешний js для математического режима в блестящих таблицах

Однако, когда я создаю файл js с кодом в переменной js, сохраняю его в папке www и загружаю, он не работает:

# UI 2
fluidPage(
  tags$head(
    tags$link(rel = "stylesheet", href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css", integrity = "sha384-9tPv11A+glH/on/wEu99NVwDPwkMQESOocs/ZGXPoIiLE8MU/qkqUcZ3zzL+6DuH", crossorigin = "anonymous"),
    tags$script(src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js", integrity = "sha384-U8Vrjwb8fuHMt6ewaCy8uqeUXv4oitYACKdB0VziCerzt011iQ/0TqlSlv8MReCm", crossorigin = "anonymous"),
    tags$script(src = "math_in_tables.js")
  ),
  titlePanel("Hello Shiny!"),
  mainPanel(
    numericInput("mean", "Enter mean", value = 1),
    tableOutput("coef_table1"),
    tableOutput("coef_table2"),
    tableOutput("table")
  ))

Внешний js для математического режима в блестящих таблицах

Математический режим больше не работает в первой таблице. Что мне здесь не хватает? В браузере ошибок нет.

Куда поместить файл math_in_tables.js? Он должен быть в подпапке www.

Stéphane Laurent 27.03.2019 13:55

Да, он находится в подпапке www, но результат тот же.

Adela 27.03.2019 15:10

Вы уверены, что в файле js нет ошибки (возможно, опубликуйте)? У вас есть сообщение об ошибке в консоли браузера (Ctrl+Shift+I)? Для меня это работает, если я заменю var code = '\\\\' + matches[i].slice(2,-2); на var code = '\\' + matches[i].slice(2,-2);. Но ваша проблема в другом.

Stéphane Laurent 27.03.2019 15:26

Я пытался изменить \\\` to \`, но безуспешно. Я отредактировал исходный пост и добавил ошибки, полученные в браузере.

Adela 28.03.2019 10:16

Для меня это работает. Так что, возможно, в вашем файле math_in_tables.js есть ошибка. Пожалуйста, разместите это.

Stéphane Laurent 28.03.2019 10:31

Я отредактировал сообщение и добавил код файла js.

Adela 28.03.2019 10:39

Что это за js-код? Почему вы изменили оригинал? Я не понимаю, что вы делаете в первом if.

Stéphane Laurent 28.03.2019 10:41

Я попытался объяснить это в редактировании, надеюсь, что теперь это более понятно.

Adela 28.03.2019 11:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что if (event.name.indexOf(event.name.match(/\\b\\w*coef_\\w+\\b/g)) > -1) не правильно.

Нужно проверить, содержит ли event.name строку coef_. Я не владею регулярными выражениями, но это должно работать:

if ((/\\b\\w*coef_\\w*\\b/g).test(event.name)){ ...

Если вы помещаете код JS во внешний файл, используйте одинарную обратную косую черту:

if ((/\b\w*coef_\w*\b/g).test(event.name)){ ...

var code = '\\' + matches[i].slice(2,-2);).

Другие вопросы по теме