Есть ли способ сделать текст "не копируемым" в RStudio RMarkdown? - PullRequest
1 голос
/ 05 июля 2019

Я преподаю несколько семинаров по R-кодированию за пару недель. Студентам нравится получать материалы заранее, и я хотел бы предоставить им RMarkdown файлы HTML, которые выступают в качестве конспекта лекции.

В классе я предпочитаю, чтобы ученики не набирали код "copy and paste". Вместо этого я читаю лекции медленнее, чтобы студенты могли практиковаться в написании кода, который, как мне кажется, действительно помогает облегчить обучение.

Есть ли способ указать в разделе YAML, что текст не является "copyable" при выводе файла .html?

Я знаю, что могу просто сохранить вывод как .pdf и запустить его через приложение, но я предпочитаю, чтобы вывод не был "paged" и имел интерактивное оглавление, если это возможно.

1 Ответ

2 голосов
/ 05 июля 2019

Я нашел быстрый взлом, основываясь на предложенной здесь отправной точке: https://css -tricks.com / almanac / properties / u / user-select /

library(shiny)

css <- ".nocopy {
  -webkit-user-select: none;  /* Chrome all / Safari all */
  -moz-user-select: none;     /* Firefox all */
  -ms-user-select: none;      /* IE 10+ */
  user-select: none;          /* Likely future */      
}"
func <- "func <- function(x, y, ...) {
  x + y
}"

ui <- fluidPage(
  tags$style(HTML(css)),
  "Copyable:",
  tags$pre(func),
  tags$hr(),
  tags$p("Not copyable:", class = "nocopy"),
  tags$pre(func, class = "nocopy")
)

server <- function(input, output, session) {}

shinyApp(ui, server)

И, как следует из этого, он может применяться к различным элементам HTML, включая <p> и <pre>. Я не тестировал другие элементы.


Как скажет вам почти любой веб-разработчик, это тривиально победить. Использование FF (большинство браузеров имеют схожую функциональность):

  • Ctrl-I (ярлык для Инструменты> Веб-разработчик &; Инструменты переключения )
  • Ctrl-Shift-C ( "Выбрать и элемент со страницы" )
  • нажмите на элемент, который вы хотите выделить и скопировать
  • в редакторе кода внизу страницы измените class="nocopy" на class="" (или что-нибудь еще)

Результат выполнения этого для текста "Not copyable:" можно увидеть здесь:

web-dev tool console showing modified css

(Я показываю эти шаги, чтобы ясно указать, что я считаю, что это небольшая попытка предотвратить лень. Те, кто выбирает более активную лень (??), не будут иметь проблем с этим. Если они на самом деле, они просто удалят определение .nocopy напрямую, чтобы повлиять на всю страницу. Но, опять же, вы не можете заставить студентов учиться так, как вы хотите: -)


Редактировать

Это так же легко работает в файле Rmd:

Файл: Nova.css

.nocopy {
  -webkit-user-select: none;  /* Chrome all / Safari all */
  -moz-user-select: none;     /* Firefox all */
  -ms-user-select: none;      /* IE 10+ */
  user-select: none;          /* Likely future */
}

Файл: Nova.Rmd

---
output: html_document
css: Nova.css
---

Copyable:

```{r chunk1}
func1 <- function(x, y, ...) {
  x + y
}
```

<p class="nocopy">Not copyable:</p>

```{r chunk2, class.source = "nocopy"}
func2 <- function(x, y, ...) {
  x + y
}
```

Существует два варианта knitr , которые можно использовать здесь: class.source= и class.output=. Я предполагаю, что вы хотите, чтобы источник был «защищен», но вы можете также захотеть вывод.

...