参见:https://zhuanlan.zhihu.com/p/30383865

    最近在写自己函数的时候遇到一个需求:

    02. 版本更新记录

    就是希望输入一个变量以获得其变量名称的字符串形式。

    虽然未能如愿,但也算是找到了替代方案,通过获得字符串以处理对应的变量。

    有两个相关的函数。

    • get()

    返回与字符串同名的变量的值。

    比如下面的代码:

    1. add_function <- function(..., source_fun = F) {
    2. if (!file.exists("./my_function.R")) file.create("./my_function.R")
    3. if (source_fun == F) {
    4. var_args <- list(...)
    5. x <- var_args[[1]]
    6. var_args[1] <- NULL
    7. sink(file = "./my_function.R")
    8. cat(paste0(x, " <-"))
    9. tmp <- get(x)
    10. print(tmp)
    11. sink()
    12. for (i in var_args) {
    13. sink(file = "./my_function.R", append = T)
    14. cat(paste0(i, " <-"))
    15. tmp <- get(i)
    16. print(tmp)
    17. sink()
    18. }
    19. message("Now you can find your functions in : ./my_function.R")
    20. }
    21. else {
    22. source("./my_function.R")
    23. message("Your functions are in environment now.")
    24. }
    25. }

    通过get,我们将字符串传入的同名函数传递给了中间变量tmp。

    • assign

    功能如其名,也就是通过字符串,来给对应的变量进行赋值。

    因此我们可以通过批量设定字符串,来创建多个不同的变量名从而设定不同的值或读取不同的内容:

    1. > n = 100
    2. > suffix = "txt"
    3. > vari = "data"
    4. > for (i in n) {
    5. + file_name = paste(i, suffix, sep = ".")
    6. + x_name = paste(vari, i, sep = "_")
    7. + assign(x_name, read.table(file_name))
    8. + }

    同样的思路,也可以通过get 批量获取变量值:

    1. > for (i in 1:n) {
    2. + y_name = paste(vari, i, sep = "_")
    3. + print(length(get(y_name)))
    4. + }