小编der*_*und的帖子

dplyr/tidyevaluation:如何将mutate中的表达式作为字符串传递?

我想编写一个有两个输入的函数:一个新变量的名称和一个数学表达式.两个参数都是字符串.

此函数应采用data.frame并添加指定的新变量,该变量应该是给定数学表达式的结果.

这是我尝试过的最小工作示例:

df <- tibble(A = 1:10, B = 1:10)
new_var <- "C"
expression <- "A + B"


example_fun <- function(new_var, expression) {
  new_var_sym <- sym(new_var)
  expression_sym <-  sym(expression)

  mutate(df, !! new_var_sym := !! expression_sym)
}

example_fun(new_var, expression)
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

Error in mutate_impl(.data, dots) : Binding not found: A + B.

当我在函数中包含mutate行时expr(),我得到了

mutate(df, `:=`(C, `A + B`))
Run Code Online (Sandbox Code Playgroud)

似乎周围的蜱A + B不应该存在,但我无法弄清楚如何摆脱它们.至少,enquo()quo_name()没有帮助.

r dplyr mutate tidyeval

11
推荐指数
1
解决办法
1648
查看次数

将 ggplots 保存到 for 循环中的列表

ggplots在 for 循环中生成 9 个,然后使用grid.arrange以下方法排列这些图:

plot_list <- list()
for(i in c(3:ncol(bilanz.vol))) {
  histogram <- ggplot(data = bilanz.vol, aes(x = bilanz.vol[,i])) +
  geom_histogram() +
  scale_x_log10() +
  ggtitle(paste(varnames[i]))

  # ggsave(filename = paste("Graphs/", vars[i], ".png", sep = ""), width = 16, height = 12, units = "cm")

  plot_list <- c(plot_list, list(histogram))
}

library(gridExtra)

png(filename = "Graphs/non-mfi.png", width = 1280, height = 960, units = "px")
do.call(grid.arrange, c(plot_list, list(ncol = 3)))
dev.off()
Run Code Online (Sandbox Code Playgroud)

代码本身运行良好,没有错误。但由于某种原因我不明白,网格显示相同的(最后一个)直方图九次。尽管如此,每个图都显示了正确的标题。

有趣的是,当我取消注释ggsave上面代码中的行时,每个图都被正确(单独)保存并显示了预期的直方图。

有任何想法吗?

r ggplot2

7
推荐指数
1
解决办法
4532
查看次数

如何在二进制 R 包中包含 HTML 小插图

我为内部目的编写了一个 R 包,还添加了一些小插曲。当我使用时devtools::install(build_vignettes = TRUE),所有小插图都正确安装在我的机器上。但是为了将包分发给大学,我想生成一个 Windows 二进制文件。

但是,当我从 RStudio Build 窗格使用Build binary package时,从生成的二进制文件安装包时不会显示小插图。我想我可以在构建二进制包之前将小插图从 移动docinst/doc,但是这需要在小插图更改时手动完成。

R CMD INSTALL --help我无法确定是否可以选择包括构建小插图。

难道还有比从手动复制这些文件提供任何更好的选择docinst/doc

我已经试过了devtools::build_vignettes()。这是控制台中的输出:

> devtools::build_vignettes()
Building archivR vignettes
Moving vig1.html, vig2.html, vig1.R, vig2.R to doc/
Copying vig1.Rmd, vig2.Rmd to doc/
Building vignette index
Run Code Online (Sandbox Code Playgroud)

它说文件被复制到doc/. 它们不会出现在inst/doc.

r build package

6
推荐指数
2
解决办法
831
查看次数

参考数字与书籍

由于某种原因,我在书籍文档中交叉引用数字时遇到问题。这是一个最小的例子:

---
output: 
  bookdown::html_document2: 
    fig_caption: yes
---

Reference example: \@ref(fig:plot-cars):

```{r plot-cars, fig.cap = "A car plot"}
plot(cars)
```
Run Code Online (Sandbox Code Playgroud)

当我编织这个时,R Markdown 抛出以下警告......

Warning message:
The label(s) fig:plot-cars not found
Run Code Online (Sandbox Code Playgroud)

...这个结果: 在此输入图像描述

这个问题似乎与这个问题非常相似,通过更新解决了这个问题bookdown。据我了解,session_info()这应该不再是问题:

Session info -----------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.3.1 (2016-06-21)
 system   i386, mingw32               
 ui       RStudio (0.99.489)          
 language (EN)                        
 collate  German_Germany.1252         
 tz       Europe/Berlin               
 date     2017-01-20                  

Packages ---------------------------------------------------------------------------------------------
 package   * version date       source        
 bookdown    0.3     2016-11-28 CRAN (R 3.3.2)
 devtools    1.9.1   2015-09-11 CRAN (R 3.2.2) …
Run Code Online (Sandbox Code Playgroud)

r cross-reference figures r-markdown bookdown

5
推荐指数
2
解决办法
2934
查看次数

使用`readr :: read_csv_chunked()`读取块中的csv文件

我想阅读更大的csv文件,但遇到内存问题.因此,我想尝试read_csv_chunked()readr包中读取它们.我的问题是我真的不明白这个callback论点.

这是我迄今为止尝试过的最小例子(我知道我必须包含所需的操作f(),否则在内存使用方面不会有优先权,对吧?):

library(tidyverse)
data(diamonds)
write_csv(diamonds, "diamonds.csv") # to have a csv to read

f <- function(x) {x}
diamonds_chunked <- read_csv_chunked("diamonds.csv", 
                                     callback = DataFrameCallback$new(f),
                                     chunk_size = 10000)
Run Code Online (Sandbox Code Playgroud)

我试图让callback论证接近官方文档中的例子:

# Cars with 3 gears
f <- function(x, pos) subset(x, gear == 3)
read_csv_chunked(readr_example("mtcars.csv"), 
                 DataFrameCallback$new(f), 
                 chunk_size = 5)
Run Code Online (Sandbox Code Playgroud)

但是,我收到下面的错误,似乎在第一个块被读取后出现,因为我看到进度条移动到18%.

eval中的错误(替换(expr),envir,enclos):未使用的参数(索引)

我已经尝试将我想要的操作包含在其中f(),但我仍然遇到了同样的错误.

csv r chunks readr

5
推荐指数
2
解决办法
1742
查看次数

R:未构建包小插图

问题

我为我的公司创建了一个小的内部包。为了描述使用它的热度,我写了一个小插图。但是由于某种原因,当我在 RStudio 中点击安装并重新启动时,没有构建小插图。

更多信息

  • 我使用 roxygen 作为包文档

  • 有趣的是,Install and Restart的输出表明它已安装:

    ==> devtools::document(roclets=c('rd', 'collate', 'namespace'))
    
    Updating DataReportR documentation
    Loading DataReportR
    Documentation completed
    
    ==> Rcmd.exe INSTALL --no-multiarch --with-keep.source DataReportR
    
    * installing to library 'C:/Program Files/R/library'
    * installing *source* package 'DataReportR' ...
    ** R
    ** preparing package for lazy loading
    ** help
    *** installing help indices
    ** building package indices
    ** installing vignettes
    ** testing if installed package can be loaded
    * DONE (DataReportR)
    
    Run Code Online (Sandbox Code Playgroud)
  • devtools::build_vignettes()NULL即使行也返回

    Suggests: …
    Run Code Online (Sandbox Code Playgroud)

vignette r r-package

5
推荐指数
1
解决办法
1415
查看次数

如何在 R 中的包启动时记住函数

我正在开发一个封装 API 调用的 R 包。为了减少实际调用的次数并加快速度,我记住了进行 API 调用的函数。为此,我创建了以下函数,它允许设置缓存目录:

memoise_fromJSON <- function(cache_dir = tempdir()) {
  memoise::memoise(jsonlite::fromJSON,
                   cache = memoise::cache_filesystem(cache_dir))
}
Run Code Online (Sandbox Code Playgroud)

创建我使用的记忆函数

memoised_fromJSON <- memoise_fromJSON()
Run Code Online (Sandbox Code Playgroud)

现在,由于我在包中多次需要记住的函数,因此我想在包启动时记住该函数。我试过

.onLoad <- function(libname, pkgname) {
  memoised_fromJSON <- my_package:::memoise_fromJSON()
}
Run Code Online (Sandbox Code Playgroud)

但我仍然需要运行memoised_fromJSON <- memoise_fromJSON()才能使其正常工作。

所以我的问题是:

  1. 是否有可能在包启动时记住一个函数?
  2. 如果是这样,我怎样才能以在全局环境中不可见的方式记住该函数?

我想,这些问题在某种程度上是相关的。我的理解是否正确,我的尝试.onLoad()不起作用,因为它在 的环境中创建了记忆功能.onLoad()


PS:我知道,我无法更改cache_dir包加载,但我想设置一个合理的默认值,这样就可以轻松启动。但是,这保留了在需要时更改缓存目录的可能性。

r r-package memoise

5
推荐指数
1
解决办法
411
查看次数

如何在函数中传递“一切可能”?

我正在尝试data.table在我正在处理的包中的面向用户的功能中使用。我希望这个函数表现得尽可能data.table像。例如,这意味着我的函数还具有一个by参数,该参数被传递给data.table函数内的底层调用。用户应该可以自由地将任何内容传递到“我的”中by,这可以直接在data.table.

从中引用?data.table包括:

  1. 单个不带引号的列名:例如,DT[, .(sa=sum(a)), by=x]
  2. 列名表达式的 list() :例如,DT[, .(sa=sum(a)), by=.(x=x>0, y)]
  3. 包含逗号分隔列名的单个字符串(其中空格很重要,因为列名即使在开头或结尾也可能包含空格):例如,DT[, sum(a), by="x,y,z"]
  4. 列名的字符向量:例如,DT[, sum(a), by=c("x", "y")]
  5. 或形式为 startcol:endcol: eg, DT[, sum(a), by=x:z]

这是一个最小(部分)工作示例,以明确我的意图:

library(data.table)
#> Warning: package 'data.table' was built under R version 3.6.2
sample_dt <- data.table(a = 1:5, b = 5:1)

count_by <- function(dt, by = NULL) {
    by <- substitute(by)
    dt[, .N, by = eval(by, dt, parent.frame())]
}

count_by(sample_dt)               
#>    N
#> …
Run Code Online (Sandbox Code Playgroud)

r data.table non-standard-evaluation

5
推荐指数
1
解决办法
149
查看次数

在 data.table 的“by”中使用符号列表

我想编写一个函数outer_fun(),它执行一些操作并调用另一个函数inner_fun()。来自 的所有参数outer_fun()都传递给inner_fun()

inner_fun()对 a data.table(这是两个函数的参数)进行一些计算。要通过该函数传递的另一个参数是by

这是我所拥有的草图:

library(data.table)

data("CO2")
setDT(CO2)

outer_fun <- function(DT, by) {
    # some other stuff
    by <- substitute(by)
    inner_fun(DT, by)
}

inner_fun <- function(DT, by) {
    DT[, .(mean = mean(uptake)),
    by = list(Plant, by)]
}

outer_fun(CO2, by = Type)
Run Code Online (Sandbox Code Playgroud)

这会引发错误:

Error in `[.data.table`(DT, , .(mean = mean(uptake)), by = list(Plant,  : 
  column or expression 2 of 'by' or 'keyby' is type language. Do not quote …
Run Code Online (Sandbox Code Playgroud)

evaluation r data.table

5
推荐指数
1
解决办法
383
查看次数

knitr kable:RNW的PDF中的文本颜色为灰色

当我使用knitr::kableRNW文件中的函数创建表格时,PDF中表格项的文本颜色看起来是灰色的。

我想将其更改为黑色。我怎样才能做到这一点?

r text-coloring knitr rnw

4
推荐指数
1
解决办法
310
查看次数

xaringan:更改长宽比的简便方法?

我想将xaringan演示文稿的长宽比更改为16:9。我想如果我可以创建一个自定义的CSS主题,那将是可能的。但是,这对我来说有点过头了。

那么,有没有真正简单的方法呢?

r xaringan

4
推荐指数
1
解决办法
195
查看次数

如何将 data.table 代码转换为折叠

我最近阅读了collapse包,并尝试翻译以下data.table代码collapse以查看它在实际示例中是否更快。

这是我的data.table代码:

library(data.table)
library(nycflights13)

data("flights")
flights_DT <- as.data.table(flights)

val_var <- "arr_delay"
id_var <- "carrier"
by <- c("month", "day")

flights_DT[
  j = list(agg_val_var = sum(abs(get(val_var)), na.rm = TRUE)), 
  keyby = c(id_var, by)
][
  i = order(-agg_val_var), 
  j = list(value_share = cumsum(agg_val_var)/sum(agg_val_var)), 
  keyby = by
][
  j = .SD[2L],
  keyby = by
][
  order(-value_share)
]
#>      month day value_share
#>   1:    10   3   0.5263012
#>   2:     1  24   0.5045664
#>   3:     1  20   0.4885145 …
Run Code Online (Sandbox Code Playgroud)

r collapse data.table

2
推荐指数
1
解决办法
110
查看次数