r语言 - 如何将变量的不带引号的名称(而不是其值)动态传递到函数中?



我想写一个函数来分析几个数据集中的几个相同的变量 我构建了下面的函数,但它不能很好地工作。我不确定如何在函数中动态传递名称。有人可以帮忙吗?

有 10 个相同的变量(testvar1、testvar2,...,testvar10 等( 在 15 个不同的数据集(mydata1、mydata2,...我的数据15等(

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

您可以等效地使用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)
...
}

为了感兴趣,你也可以使用准报价,但考虑到你最终会把你的变量包装成一个向量,我想它不是那么有用。将是以下形式:

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)。但如前所述,在您的情况下可能不是最有用的。

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

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

最新更新