我想编写一个有两个输入的函数:一个新变量的名称和一个数学表达式.两个参数都是字符串.
此函数应采用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()没有帮助.
我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 包,还添加了一些小插曲。当我使用时devtools::install(build_vignettes = TRUE),所有小插图都正确安装在我的机器上。但是为了将包分发给大学,我想生成一个 Windows 二进制文件。
但是,当我从 RStudio Build 窗格使用Build binary package时,从生成的二进制文件安装包时不会显示小插图。我想我可以在构建二进制包之前将小插图从 移动doc到inst/doc,但是这需要在小插图更改时手动完成。
从R CMD INSTALL --help我无法确定是否可以选择包括构建小插图。
难道还有比从手动复制这些文件提供任何更好的选择doc来inst/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.
由于某种原因,我在书籍文档中交叉引用数字时遇到问题。这是一个最小的例子:
---
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) 我想阅读更大的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(),但我仍然遇到了同样的错误.
我为我的公司创建了一个小的内部包。为了描述使用它的热度,我写了一个小插图。但是由于某种原因,当我在 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)我正在开发一个封装 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()才能使其正常工作。
所以我的问题是:
我想,这些问题在某种程度上是相关的。我的理解是否正确,我的尝试.onLoad()不起作用,因为它在 的环境中创建了记忆功能.onLoad()?
PS:我知道,我无法更改cache_dir包加载,但我想设置一个合理的默认值,这样就可以轻松启动。但是,这保留了在需要时更改缓存目录的可能性。
我正在尝试data.table在我正在处理的包中的面向用户的功能中使用。我希望这个函数表现得尽可能data.table像。例如,这意味着我的函数还具有一个by参数,该参数被传递给data.table函数内的底层调用。用户应该可以自由地将任何内容传递到“我的”中by,这可以直接在data.table.
从中引用?data.table包括:
- 单个不带引号的列名:例如,DT[, .(sa=sum(a)), by=x]
- 列名表达式的 list() :例如,DT[, .(sa=sum(a)), by=.(x=x>0, y)]
- 包含逗号分隔列名的单个字符串(其中空格很重要,因为列名即使在开头或结尾也可能包含空格):例如,DT[, sum(a), by="x,y,z"]
- 列名的字符向量:例如,DT[, sum(a), by=c("x", "y")]
- 或形式为 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) 我想编写一个函数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) 当我使用knitr::kableRNW文件中的函数创建表格时,PDF中表格项的文本颜色看起来是灰色的。
我想将其更改为黑色。我怎样才能做到这一点?
我想将xaringan演示文稿的长宽比更改为16:9。我想如果我可以创建一个自定义的CSS主题,那将是可能的。但是,这对我来说有点过头了。
那么,有没有真正简单的方法呢?
我最近阅读了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)