【发布时间】:2020-04-03 16:01:29
【问题描述】:
我有一个小函数可以使用str_subset 读取具有特定字符串的文件,如果我用引号传递参数,它就可以工作,但我希望不这样做。我以为我可以用 curly curly 做到这一点,但没有用。
使用引号传递的工作示例:
#creating csv file
library(tidyverse)
write_csv(mtcars, "C:\\Users\\testSTACK.csv")
#reading function
read_in_fun <- function(x) {
setwd("C:\\Users")
d <- list.files() #lists all files in folder
file <- d %>%
str_subset(pattern = x)
#read in
df <- read_csv(file)
arg_name <- deparse(substitute(x))
var_name <- paste("df_new", arg_name, sep = "_")
assign(var_name, df, env = .GlobalEnv)
}
read_in_fun("STACK")
#this works, returns df called:
df_new_"STACK"
现在,如果我尝试使用 curly curly 方法在不带引号的情况下通过:
read_in_fun <- function(x) {
setwd("C:\\Users")
d <- list.files() #lists all files in folder
file <- d %>%
str_subset(pattern = {{x}})
#read in
df <- read_csv(file)
arg_name <- deparse(substitute(x))
var_name <- paste("df_new", arg_name, sep = "_")
assign(var_name, df, env = .GlobalEnv)
}
read_in_fun(STACK)
#Error in type(pattern) : object 'STACK' not found
也尝试使用enquo
read_in_fun <- function(x) {
x_quo <- enquo(x)
setwd("C:\\Users")
d <- list.files() #lists all files in folder
file <- d %>%
str_subset(pattern = !! as_label(x_quo)) #OR !!(x_quo)
#read in
df <- read_csv(file)
arg_name <- deparse(substitute(x))
var_name <- paste("df_new", arg_name, sep = "_")
assign(var_name, df, env = .GlobalEnv)
}
read_in_fun(STACK)
# Error during wrapup: Quosures can only be unquoted within a quasiquotation context.
我想要的输出是一个名为df_new_STACK 的df。 curl curl 可以这样使用吗?谢谢
【问题讨论】:
-
你只是想传入一个字符串吗?如果不是字符串,您在不带引号的情况下传递什么? Curly-curly 有一个非常不同的用例,通常用于引用数据框中的列。
-
我正在尝试传入不带引号的字符串,例如
read_in_fun(STACK)。是的 curly curly 可以用于过滤列,我认为str_subset在这种情况下可以被认为是这种情况的扩展。我在这里过滤d? -
Curly-curly 不过滤列,它允许您引用列名。请阅读here 关于非标准评估。如果你想要的只是
df_new_STACK,只需使用var_name <- paste("df_new", x, sep = "_"),不要使用deparse(substitute())并传入一个字符串。 -
我不想传递带引号的字符串。我想运行
read_in_fun(STACK)而不是read_in_fun("STACK")