小编AJP*_*123的帖子

dplyr 0.7.0 tidyeval in package

前言

我通常dplyr在我的包中使用.在此之前0.7.0,我使用dplyr动词的强调版本来避免在注释期间R CMD CHECK.例如,代码:

x <- tibble::tibble(v = 1:3, w = 2)
y <- dplyr::filter(x, v > w)
Run Code Online (Sandbox Code Playgroud)

本来会产生这样的R CMD CHECK说明:

* checking R code for possible problems ... NOTE
no visible binding for global variable ‘v’
Run Code Online (Sandbox Code Playgroud)

相比之下,使用标准评估版:

y <- dplyr::filter_(x, ~v > w)
Run Code Online (Sandbox Code Playgroud)

没有发出这样的说明.

但是,使用dplyr编程dplyr 0.7.0的插图表示在包中包含函数的适当语法(以避免注释)是:dplyr

y <- dplyr::filter(x, .data$v > .data$w)
Run Code Online (Sandbox Code Playgroud)

因此,新闻文件说"不再需要每个主要动词的强调版本,因此这些功能已被弃用(但为了向后兼容性而保持不变)."

小插图说上面的新语法不会产生R CMD checkNOTES,"只要你还导入rlang::.data@importFrom rlang …

r dplyr r-package tidyeval rlang

13
推荐指数
1
解决办法
529
查看次数

dplyr sample_n其中n是分组变量的值

我有以下分组数据框,我想使用该函数dplyr::sample_n从每个组的数据框中提取行.我想使用NDG每个组中的分组变量的值作为从每个组中提取的行数.

> dg.tmp <- structure(list(Gene = c("CAMK1", "GHRL", "TIMP4", "CAMK1", "GHRL", 
"TIMP4", "ARL8B", "ARPC4", "SEC13", "ARL8B", "ARPC4", "SEC13"
), GLB = c(3, 3, 3, 3, 3, 3, 10, 10, 10, 10, 10, 10), NDG = c(1, 
1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -12L), .Names = c("Gene", "GLB", 
"NDG"))

> dg <- dg.tmp %>% 
     dplyr::group_by(GLB,NDG)

> dg
Source: local data frame [12 x 3] …
Run Code Online (Sandbox Code Playgroud)

r dplyr

6
推荐指数
1
解决办法
1645
查看次数

将列表列添加到R中的数据表会返回不一致的输出 - 功能还是错误?

我用来在R中$添加一个列表列data.table.当data.table有多行时,这可以按预期工作.

library(data.table)

dt2 <- data.table(x = 1:2)
dt2$y <- list(c(1, 1), c(2, 2))
dt2
#>    x   y
#> 1: 1 1,1
#> 2: 2 2,2
Run Code Online (Sandbox Code Playgroud)

但是,当data.table只有一行时,只返回列表中向量的第一个元素并带有警告:

dt1 <- data.table(x = 1)
dt1$y <- list(c(1, 1))
#> Warning in `[<-.data.table`(x, j = name, value = value): Supplied 2 items
#> to be assigned to 1 items of column 'y' (1 unused)
dt1
#>    x y
#> 1: 1 1
Run Code Online (Sandbox Code Playgroud)

这似乎不一致.它是一个功能还是一个bug?

相比之下,使用data.frames …

r data.table

6
推荐指数
1
解决办法
84
查看次数

Tibbles拒绝了lubridate的持续时间和期间对象

有效的代码:durationperiod对象

以下代码分别成功生成了一个duration对象和一个period对象.

> lubridate::as.duration(1)
[1] "1s"

> lubridate::seconds(1)
[1] "1S"
Run Code Online (Sandbox Code Playgroud)

不起作用的代码:duration和s中的period对象tibble

但是,当我尝试tibble使用一个duration或一个period对象创建s时,我得到无法提供信息的错误消息.

> tibble::tibble(y = lubridate::as.duration(1))
Error: Incompatible duration classes (Duration, numeric). Please coerce with `as.duration`.

> tibble::tibble(y = lubridate::seconds(1))
Error in x < 0 : cannot compare Period to Duration:
coerce with 'as.numeric' first.
Run Code Online (Sandbox Code Playgroud)

有效的代码:duration和s中的period对象data.frame

更换tibble::tibblebase::data.frame作品.

> data.frame(y = lubridate::as.duration(1))
   y …
Run Code Online (Sandbox Code Playgroud)

r lubridate tibble

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

ggplot2带有条件构面和整洁评估的构面网格

我想创建一个生成ggplot图的函数,并为方面变量提供可选参数facet_grid()

特别是,如果可能的话,我想纳入条件逻辑里面 facet_grid。我也想使用整洁的评估框架-所以没有公式字符串!

但是,我所有的尝试都失败了。

library(tidyverse)
iris <- iris %>% add_column(idx = rep(1:2, 75))
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试失败,因为facet_grid试图找到一个名为NULL(带有反引号)的变量。

plot_iris <- function(df_in, facet_var = NULL){
  ggplot(df_in) +
    geom_point(aes(Sepal.Length, Sepal.Width)) +
    facet_grid(vars(!!enquo(facet_var)), vars(idx))
}

plot_iris(iris)

#> Error: At least one layer must contain all faceting variables: `NULL`.
#> * Plot is missing `NULL`
#> * Layer 1 is missing `NULL`
Run Code Online (Sandbox Code Playgroud)

plot_iris(iris, Species)但是,运行正常。

我的第二次尝试也失败了,但是有不同的错误消息。

plot_iris2 <- function(df_in, facet_var = NULL){
  facet_quo <- enquo(facet_var)

  ggplot(df_in) …
Run Code Online (Sandbox Code Playgroud)

r ggplot2 tidyverse tidyeval

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

标签 统计

r ×5

dplyr ×2

tidyeval ×2

data.table ×1

ggplot2 ×1

lubridate ×1

r-package ×1

rlang ×1

tibble ×1

tidyverse ×1