【问题标题】:str_subset with curly curly in RR中带有卷曲的str_subset
【发布时间】: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_STACKdf。 curl curl 可以这样使用吗?谢谢

【问题讨论】:

  • 你只是想传入一个字符串吗?如果不是字符串,您在不带引号的情况下传递什么? Curly-curly 有一个非常不同的用例,通常用于引用数据框中的列。
  • 我正在尝试传入不带引号的字符串,例如read_in_fun(STACK)。是的 curly curly 可以用于过滤列,我认为str_subset 在这种情况下可以被认为是这种情况的扩展。我在这里过滤d?
  • Curly-curly 不过滤列,它允许您引用列名。请阅读here 关于非标准评估。如果你想要的只是df_new_STACK,只需使用var_name &lt;- paste("df_new", x, sep = "_"),不要使用deparse(substitute()) 并传入一个字符串。
  • 我不想传递带引号的字符串。我想运行 read_in_fun(STACK) 而不是 read_in_fun("STACK")

标签: r stringr rlang


【解决方案1】:

使用ensym 应该可以工作。

read_in_fun <- function(x) {

  x_sym <- ensym(x)

  d <- list.files()   
  file <- d %>% 
    str_subset(pattern = as_label(x_sym)) 

  #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)

df_new_STACK

【讨论】:

    猜你喜欢
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多