考虑以下Rmarkdown文档:
---\ntitle: "Environments"\nauthor: "Me"\ndate: "2023-01-13"\noutput: html_document\n---\n\n```{r setup}\nlibrary(glue)\nlibrary(purrr)\n```\n\n```{r vars}\na <- 1\nx <- list("`a` has the value: {a}")\n```\n\n```{r works}\nglue(x[[1L]])\n```\n\n```{r does-not-work, error = TRUE}\nmap_chr(x, glue)\n```\nRun Code Online (Sandbox Code Playgroud)\n当使用RStudio\'s knit按钮时,一切都像魅力一样工作,输出如下:
但是,如果我尝试使用自己的环境调用自己的渲染,则会失败:
\n---\ntitle: "Environments"\nauthor: "Me"\ndate: "2023-01-13"\noutput: html_document\n---\n\n```{r setup}\nlibrary(glue)\nlibrary(purrr)\n```\n\n```{r vars}\na <- 1\nx <- list("`a` has the value: {a}")\n```\n\n```{r works}\nglue(x[[1L]])\n```\n\n```{r does-not-work, error = TRUE}\nmap_chr(x, glue)\n```\nRun Code Online (Sandbox Code Playgroud)\n\n所以显然glue在使用时会在环境中绊倒purrr::map。
我如何render使用自己的环境进行调用而不生成此错误?理想情况下,我不想改变它Rmarkdown本身。
有趣的是,如果我把glue自己的function东西包裹起来,工作就会再次顺利:
```\nglue …Run Code Online (Sandbox Code Playgroud) 我是一个陌生的人JavaScript,来自不同的编程背景,我很难理解如何JavaScript知道如何解析传递给函数的参数。
让我们看一个简单的例子。从jQuery文档中 .on,我看到2个不同的签名:
.on(事件[,选择器] [,数据],处理程序)
.on(事件[,选择器] [,数据])
但是,以下代码段可以产生完全有效的代码,并且可以完成预期的工作:
$(function() {
let dat = {a: 1, b: 2}
$('#do').on('click', dat, function(evt) {
alert(evt.data.b);
});
$('#do2').on('click', function(evt) {
alert("click");
});
})Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="do">
Click!
</button>
<button id="do2">
Click!
</button>Run Code Online (Sandbox Code Playgroud)
如何JavaScript“知道” dat第一种情况下的数据(而不是selector)?显然,两个签名都没有位置匹配吗?那么,它在内部如何工作?如何在自己的功能中使用此模式?
在基地R我会做以下事情:
d <- data.frame(a = 1:4, b = 4:1, c = 2:5)
apply(d, 1, which.max)
Run Code Online (Sandbox Code Playgroud)
随着dplyr我可以做到以下几点:
library(dplyr)
d %>% mutate(u = purrr::pmap_int(list(a, b, c), function(...) which.max(c(...))))
Run Code Online (Sandbox Code Playgroud)
如果d我需要指定另一列,但我希望它可以使用任意数量的列。
从概念上讲,我想要类似的东西
pmap_int(list(everything()), ...)
pmap_int(list(.), ...)
Run Code Online (Sandbox Code Playgroud)
但这显然行不通。我将如何规范地解决这个问题dplyr?
预读
我在 SO 上浏览了一些材料:
在得到我以前的问题的完美答案后,我试图一劳永逸地了解如何规范地处理data.tables函数。
潜在问题
我最终想要的是创建一个函数,该函数将一些R表达式作为输入并在 a 的上下文中对它们进行评估data.table(在 thei和jpart 中)。引用的答案告诉我,get/eval/substitute如果我的输入变得比单列更复杂,我必须使用某种组合(在这种情况下,我可以接受..string或with = FALSE方法 [1])。
我的真实数据相当大,所以我担心计算时间。
最终,如果我想拥有完全的灵活性(即传递表达式而不是裸列名称),我明白我必须采取一种eval方法:
代码讲了一千个字,所以让我们来说明我到目前为止的发现:
设置
library(data.table)
iris <- copy(iris)
setDT(iris)
Run Code Online (Sandbox Code Playgroud)
主力功能
my_fun <- function(my_i, my_j, option_sel = 1, my_data = iris, by = NULL) {
switch(option_sel,
{
## option 1 - base R deparse
my_data[eval(parse(text = deparse(substitute(my_i)))),
eval(parse(text …Run Code Online (Sandbox Code Playgroud) 我知道我可以使用\\U前缀来编码 unicode 字符:
cat("\\U00DF", "\\n")\n# \xc3\x9f\nRun Code Online (Sandbox Code Playgroud)\n但我该如何在更长的字符串中使用它呢?
\ncat("Stra\\U00DFe", "\\n")\n# Stra\xe0\xb7\xbe\nRun Code Online (Sandbox Code Playgroud)\n我真的需要吗paste沿着unicode“断点”串起来吗?
cat(paste0("Stra", "\\U00DF", "e"), "\\n")\n# Stra\xc3\x9fe\nRun Code Online (Sandbox Code Playgroud)\n我想我只见树木不见森林,所以任何暗示都值得高度赞赏吗?
\n如果我不将任何值映射到 color以下代码,则可以顺利运行:
library(tidyverse)\nlibrary(plotly)\n\nset.seed(123)\nd <- tibble(x = 1:10, \n g = gl(2, 5), \n y = sample(100, 10), \n L = LETTERS[1:10], l = letters[1:10])\n\nplot_ly(d) %>%\n add_bars(x = ~ x, y = ~ y, customdata = ~ map2(l, L, list),\n hovertemplate = "%{customdata[0]}:%{customdata[1]}")\nRun Code Online (Sandbox Code Playgroud)\n\n然而,当我尝试为条形提供不同的颜色时,数据的(内部)形状发生变化,并且 R 抱怨形状不匹配:
\nplot_ly(d) %>%\n add_bars(x = ~ x, y = ~ y, color = ~ g, customdata = ~ map2(l, L, list),\n hovertemplate = "%{customdata[0]}:%{customdata[1]}")\nRun Code Online (Sandbox Code Playgroud)\n\nRun Code Online (Sandbox Code Playgroud)Error in `recycle_columns()`:\n! Tibble columns …
有人可以向我解释为什么以下两条指令有不同的输出:
library(plyr)
library(dplyr)
ll <- list(a = mtcars, b = mtcars)
# using '.' as a function parameter
llply(ll, function(.) . %>% group_by(cyl) %>% summarise(min = min(mpg)))
# using 'd' as function parameter
llply(ll, function(d) d %>% group_by(cyl) %>% summarise(min = min(mpg)))
Run Code Online (Sandbox Code Playgroud)
前一种情况显然甚至没有评估(我通过拼写错误来判断summarise:不会 抛出错误).llply(ll, function(.) . %>% group_by(cyl) %>% sumamrise(min = min(mpg)))
因此,这与范围规则和评估事项有关,但我真的想了解发生了什么,以及为什么会发生这种情况?我.经常使用匿名函数作为参数,我很困惑地看到结果.
长话短说,为什么不.配合%>%?
我想编写一个动态数字n的模块,比如UI元素.我发现input插槽与当前的元素数量不对应,但是在会话期间选择的最大数量:
library(shiny)
library(plyr)
testUI <- function(id) {
ns <- NS(id)
uiOutput(ns("container"))
}
test <- function(input, output, session, numElems) {
output$container <- renderUI(do.call(tagList, llply(1:numElems(), function(i)
selectInput(session$ns(paste0("elem", i)),
label = i, choices = LETTERS[sample(26, 3)]))))
getNames <- reactive(reactiveValuesToList(input))
list(getNames = getNames)
}
ui <- fluidPage(numericInput("n", "Number of Elems", value = 3),
testUI("column1"),
verbatimTextOutput("debug"))
server <- function(input, output, session) {
getN <- reactive(input$n)
handler <- callModule(test, "column1", getN)
output$debug <- renderPrint(handler$getNames())
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
如果您在数字输入字段,从改变元素的个数3来 …
如果我想改变 a 的字体大小,geom_text我可以使用该size参数。但是,如果我有一个ggplot由其他人生成的对象(例如在函数中)并且我想随后更改字体大小怎么办?(我可以重写该函数并允许使用额外的大小参数,但我想避免这种情况)。
我玩过theme(text = element_text(size = 20)),但这改变了每个文本,但是geom_text?我还尝试用新geom_text层替换相应层。但是,由于在外部函数调用中, 的数据参数已geom_text更改,因此我收到有关缺少美观性的错误。
代码
library(ggplot2)
functionICannotControl <- function() {
mdat <- mtcars
mdat$cyl2 <- LETTERS[mdat$cyl]
ggplot(mtcars, aes(x = hp, y = mpg)) + geom_text(aes(label = cyl2), data = mdat)
}
(bp <- functionICannotControl())
## changed only other text elements
bp + theme(text = element_text(size = 20))
## gives an error
bp2 <- bp
bp2$layers[[1]] <- geom_text(size = 20) …Run Code Online (Sandbox Code Playgroud) 假设我的字符串中有一个特定的模式,该模式出现了已知的次数 ( n),并且我们不想对字符串的其余部分(特别是这些模式之间的字符串)做出任何假设。
此外,我有一个长度向量n(sf例如),我想用相应的元素修改模式的每次出现。因此,对于每场比赛,我想知道比赛已经发生了多少次?
我可以想到以下解决方案:
library(stringr)
sf <- letters[4:1]
ss <- "fdskjhf xx sd ss xx wwwe xx ss xx sdsd"
# ^^ 1st ^^ 2nd ^^ 3rd ^^ 4th
# add: _sf[1] _sf[2] _sf[3] _sf[4]
# that is: xx_d xx_c xx_b xx_a
## add _sf[i] to the ith occurence of "xx" in ss
goal <- "fdskjhf xx_d sd ss xx_c wwwe xx_b ss xx_a sdsd"
my_replacer_factory <- function(sf, start = 0) {
cnt <- …Run Code Online (Sandbox Code Playgroud) r ×9
dplyr ×2
purrr ×2
data.table ×1
environment ×1
ggplot2 ×1
javascript ×1
plotly ×1
plyr ×1
r-glue ×1
r-markdown ×1
regex ×1
shiny ×1
stringr ×1
tidyverse ×1
unicode ×1