考虑这个例子:
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)
!!应用于字符串而不是符号会实现什么效果,为什么它会返回空数据帧而不是错误?
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)
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |