如何将变量的未引用名称(而不是其值)动态传递给函数?

问题描述 投票:0回答:2

我希望编写一个函数来分析多个数据集中的几个相同变量我在下面构建了该功能,但效果不佳。我不确定如何在函数中动态传递名称。有人可以帮忙吗?

有10个相同的变量(testvar1,testvar2,...,testvar10等...)15个不同的数据集中(mydata1,mydata2,... mydata15等))

library(readxl)

to_analyze <- function (data="mydata1", var = testvar1) {

  #reading my file in
  excelfile <- paste(`data`, "xlsx", sep = ".")
  dataset_name <- read_excel(excelfile)

  #populating the testvar1, testvar2,...
  dataset_name$var_interest <-  dataset_name$var #this does not work
  #I was hoping it would give dataset_name$var_interest <- dataset_name$testvar1

  #creating a smaller dataset
  eco <- dataset_name %>% 
    select(id, var_interest) #I want var_interest to be testvar1 (not the value but the name)

  ##doing some analysis on that dataset
}


#creating another function for all the datasets (15 total)

fct_all <- function(x){
  for(i in 1:15){
    iq <- as.double(i)
    dsn <- paste("mydata", deparse(iq), sep="")
    to_analyze(data=dsn, var = x)
  }
}

#applying the function for all the variables

all_var <- c(testvar1, testvar2, testvar3)
fct_all(all_var)```
r substitution quote
2个回答
1
投票

您可以等效地使用data$var1data[['var1']]。这意味着在第二种形式中,当您将变量名提供为字符串时,可以轻松地用动态变量名替换字符串:

var <- 'var1'
dataset_name$var_interest <- dataset_name[[var]]

请注意,dplyr非常聪明,并且确实接受字符串或符号。这意味着您可以使用以下形式之一进一步简化功能:

library(dplyr)

# Using select then rename with the var given as a string
to_analyze <- function (data = "mydata1", var = "testvar1") {
  eco <- paste(data, "xlsx", sep = ".") %>%
    read_excel() %>%
    select(id, var) %>%
    rename(var_intereset = var)
  ...
}

为了感兴趣,您也可以使用quasiquotation,但是考虑到最终要将变量包装到向量中,我想它没什么用。会是以下形式:

library(dplyr)

to_analyze <- function (data = "mydata1", var = quo(testvar1)){
  quo_var <- enquo(var)
  eco <- paste(data, "xlsx", sep = ".") %>%
    read_excel() %>%
    select(id, !!quo_var) %>%
    rename(var_intereset = !!quo_var)
  ...
}

此表单允许您使用原始变量名称而不是字符串来调用变量:to_analyse(data = "mydata1", var = testvar1)。但是如前所述,可能对您而言不是最有用的。


0
投票

谢谢@Romain。您的代码运行良好。我只是将单引号改为反引号

var <- `var`

to_analyze <- function (data = "mydata1", var = "testvar1") {
  eco <- paste(data, "xlsx", sep = ".") %>%
    read_excel() %>%
    select(id, var) %>%
    rename(var_intereset = var)
  ...
}
© www.soinside.com 2019 - 2024. All rights reserved.