参见:https://zhuanlan.zhihu.com/p/30383865
最近在写自己函数的时候遇到一个需求:
就是希望输入一个变量以获得其变量名称的字符串形式。
虽然未能如愿,但也算是找到了替代方案,通过获得字符串以处理对应的变量。
有两个相关的函数。
- get()
返回与字符串同名的变量的值。
比如下面的代码:
add_function <- function(..., source_fun = F) {if (!file.exists("./my_function.R")) file.create("./my_function.R")if (source_fun == F) {var_args <- list(...)x <- var_args[[1]]var_args[1] <- NULLsink(file = "./my_function.R")cat(paste0(x, " <-"))tmp <- get(x)print(tmp)sink()for (i in var_args) {sink(file = "./my_function.R", append = T)cat(paste0(i, " <-"))tmp <- get(i)print(tmp)sink()}message("Now you can find your functions in : ./my_function.R")}else {source("./my_function.R")message("Your functions are in environment now.")}}
通过get,我们将字符串传入的同名函数传递给了中间变量tmp。
- assign
功能如其名,也就是通过字符串,来给对应的变量进行赋值。
因此我们可以通过批量设定字符串,来创建多个不同的变量名从而设定不同的值或读取不同的内容:
> n = 100> suffix = "txt"> vari = "data"> for (i in n) {+ file_name = paste(i, suffix, sep = ".")+ x_name = paste(vari, i, sep = "_")+ assign(x_name, read.table(file_name))+ }
同样的思路,也可以通过get 批量获取变量值:
> for (i in 1:n) {+ y_name = paste(vari, i, sep = "_")+ print(length(get(y_name)))+ }
