有没有一种方法可以使文本在RStudio RMarkdown中“不可复制”?

时间:2019-07-05 14:06:01

标签: r copy yaml rstudio r-markdown

我将在几周内教一些R编码研讨会。学生喜欢提前接收材料,我希望为他们提供RMarkdown HTML文件,这些文件可以作为讲义。

在课堂上,我更喜欢学生而不是“ copy and paste”代码。取而代之的是,我以较慢的速度进行授课,以便学生可以练习编写代码,我认为这确实有助于促进学习。

当我输出copyable文件时,是否可以在YAML部分中指定文本不是“ .html”?

我知道我可以将输出另存为.pdf并通过应用程序运行,但我希望输出不是“ paged”,并且如果可能的话,应具有交互式目录

1 个答案:

答案 0 :(得分:2)

根据此处建议的起点,我发现了一个快速破解方法: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工具> Web开发人员和;切换工具的快捷方式)
  • 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 optionsclass.source=class.output=。我假设您希望对源进行“保护”,但是您可能也希望输出。