和有什么区别!!和!!as.symbol?

rtr*_*trt 5 r dplyr

考虑这个例子:

library(dplyr)
df <- data.frame(a=1:5,b=6:10)

> df
  a  b
1 1  6
2 2  7
3 3  8
4 4  9
5 5 10
Run Code Online (Sandbox Code Playgroud)
colname <- "a"
df |> filter(!!as.symbol(colname)<3)

  a b
1 1 6
2 2 7
Run Code Online (Sandbox Code Playgroud)
df |> filter(!!colname<3)
[1] a b
<0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)

!!应用于字符串而不是符号会实现什么效果,为什么它会返回空数据帧而不是错误?

G. *_*eck 6

df让我们首先使用问题中的the 来扩展示例,然后使用df2which isdf加上一个名为 的额外列colname

是否colname为列:

  • !!as.symbol(colname)a以向量形式返回列的值

  • !!colname返回字符串"a"

  • !!"colname" 返回字符串"colname"

但是,!!as.symbol("colname")根据是否colname为列名,行为会有所不同。

df <- data.frame(a=1:5,b=6:10);
colname <- "a"
look <- function(x) { str(x); x }

df |> filter(look(!!as.symbol(colname)) < 3) |> invisible()
##  int [1:5] 1 2 3 4 5
df |> filter(look(!!as.symbol("colname")) < 3) |> invisible()
##  chr "a"
df |> filter(look(!!colname) == "a") |> invisible()
##  chr "a"
df |> filter(look(!!"colname") == "a") |> invisible()
##  chr "colname"

####

df2 <- data.frame(a=1:5,b=6:10,colname=c(11:14, 1));
colname <- "a"
look <- function(x) { str(x); x }
 
df2 |> filter(look(!!as.symbol(colname)) < 3) |> invisible()
##  int [1:5] 1 2 3 4 5
df2 |> filter(look(!!as.symbol("colname")) < 3) |> invisible()
##  num [1:5] 11 12 13 14 1
df2 |> filter(look(!!colname) == "a") |> invisible()
##  chr "a"
df2 |> filter(look(!!"colname") == "a") |> invisible()
##  chr "colname"
Run Code Online (Sandbox Code Playgroud)