参见: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] <- NULL
sink(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)))
+ }