Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将整洁的select参数传递给内部函数,同时保持“丢失”_R_Rlang_Tidyeval - Fatal编程技术网

R 将整洁的select参数传递给内部函数,同时保持“丢失”

R 将整洁的select参数传递给内部函数,同时保持“丢失”,r,rlang,tidyeval,R,Rlang,Tidyeval,有人能帮我找出解决这个问题的标准方法吗: 外部采用数据帧数据和可选数据!整洁选择参数var。 var被传递到内部 内部仅在不缺少var时执行选择 要求:内部和外部的签名应该相同,因为内部可以独立调用 这是我的方法,但它不起作用。 问题:missingvar在外部返回TRUE,但在内部返回FALSE 内部[1]错误 >包含0列和6行的数据框 车内 >[1]是的 >mpg气缸显示hp drat wt qsec与am齿轮carb >马自达RX4 21.0 6 160 110 3.90 2.620 16

有人能帮我找出解决这个问题的标准方法吗:

外部采用数据帧数据和可选数据!整洁选择参数var。 var被传递到内部 内部仅在不缺少var时执行选择 要求:内部和外部的签名应该相同,因为内部可以独立调用 这是我的方法,但它不起作用。 问题:missingvar在外部返回TRUE,但在内部返回FALSE

内部[1]错误 >包含0列和6行的数据框 车内 >[1]是的 >mpg气缸显示hp drat wt qsec与am齿轮carb >马自达RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 >马自达RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 >Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 4 1 >大黄蜂4路21.46258110 3.083.21519.441031 >大黄蜂运动约18.7 8 360 175 3.15 3.440 17.02 0 3 2 >英勇18.16 225 105 2.76 3.460 20.22 1 0 3 1 ... 我天真的解决方案是检查outer中的missingvar,并相应地将调用更改为inner(见下文),但我想知道是否有一种方法可以在不进行任何此类检查的情况下传递var参数

工作正常
啊,对不起!我不知道为什么我会想到这个!!维持现状是必要的。事实证明,传递可选参数而不改变其缺失度是如此简单:

inner <- function(data, var) {
  print(missing(var))
  if (missing(var)) {
    print(colnames(data))
  } else {
    print(colnames(dplyr::select(data, {{ var }})))
  }
}

outer <- function(data, var) {
  print(missing(var))
  inner(data, var)
}

outer(mtcars, dplyr::starts_with("m"))

#> [1] FALSE
#> [1] FALSE
#> [1] "mpg"

outer(mtcars)

#> [1] TRUE
#> [1] TRUE
#> [1] "mpg"  "cyl"  "disp"  "hp"  "drat" "wt" "qsec" "vs" "am"  "gear" "carb"

编辑:显示如果参数没有丢失,如何查询missingness和应用tidy selection。

一种方法是将适当的默认参数提供给var,并无条件地将其传递给select:

内部[1]显示图 对于不需要的更复杂的情况,您需要解开!!以及在单个{{操作中合并的步骤。然后您可以检查已解除的quosure:


内在的{{和等价!!enquo是必需的。没有它,你的tidyselect参数将无法正常工作。抱歉,我不清楚。有效的方法是它保留了缺失,这样可以在内部查询它,并且只有在var参数没有丢失的情况下,才可以使用整洁的选择。我已经更新了我的响应。无论如何,我认为你的一切都解决了on更好。我喜欢使用一切作为默认参数的简单性,但我也从更复杂的解决方案中学到了一些东西。回答得很好,非常感谢!