R上的三个感叹号

Ale*_*xis 7 r

我一直在读一本关于特征工程的书,一段代码有一个我不明白的三重感叹号:

vc_pred <- 
  recipe(Stroke ~ ., data = stroke_train %>% dplyr::select(Stroke, !!!VC_preds)) %>% 
  step_YeoJohnson(all_predictors()) %>% 
  prep(stroke_train %>% dplyr::select(Stroke, !!!VC_preds)) %>% 
  juice() %>% 
  gather(Predictor, value, -Stroke)
Run Code Online (Sandbox Code Playgroud)

VC_preds 是一个包含连续预测变量名称的向量。我理解除!!!标记外的所有代码。一个!应该是一个否定,但它是什么意思!!!

提供的任何帮助将不胜感激。谢谢你。

问候,

亚历克西斯

Ron*_*hah 10

!!! 通常用于评估表达式列表。

library(dplyr)
library(rlang)

VC_preds <- c('mpg', 'cyl')
mtcars %>% select(!!!VC_preds) %>% head

#                   mpg Cyl
#Mazda RX4         21.0   6
#Mazda RX4 Wag     21.0   6
#Datsun 710        22.8   4
#Hornet 4 Drive    21.4   6
#Hornet Sportabout 18.7   8
#Valiant           18.1   6
Run Code Online (Sandbox Code Playgroud)

如果VC_preds是您示例中的向量,也!!应该可以正常工作。

mtcars %>% select(!!VC_preds) %>% head
Run Code Online (Sandbox Code Playgroud)

帮助页面?"!!!"给出了一个更好的例子来理解差异。

vars <- syms(c("height", "mass"))
vars
#[[1]]
#height

#[[2]]
#mass

starwars %>% select(!!!vars)
# A tibble: 87 x 2
#   height  mass
#    <int> <dbl>
# 1    172    77
# 2    167    75
# 3     96    32
# 4    202   136
# 5    150    49
# 6    178   120
# 7    165    75
# 8     97    32
# 9    183    84
#10    182    77
# … with 77 more rows
Run Code Online (Sandbox Code Playgroud)

  • `help('topic-inject')` 提供了另一种解释和上下文。 (2认同)