R系列之将字符串转化为变量

这篇文章学习了可以将字符串转换为变量的assign(还有类似的list2env)以及得到字符串对应的对象名称的函数get,这两个函数可以用于批量文件的读取和后续的处理。

数据准备

1
2
# 使用shell来生成5个文件,每个文件存放对应的数字
for i in {1..5};do echo ${i} >data_${i}.txt;done

将字符串转换为变量-assign

将data_1存储为读取了data_1.txt文件内容的变量,data_2存储为读取了data_2.txt文件内容的变量,以此类推.

直接使用字符串达不到目的

直接使用data_1=read.table('data_1.txt')会得不到想要的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 在进行操作之前的变量列表
ls()
character(0)
# 试图将data_1存储为读取了data_1.txt文件内容
for (i in 1:5){
file_name=paste0("data_",i,".txt")
varchr=paste0("data_",i)
print(varchr)
varchr=read.table(file_name)
}
# 操作之后的变量列表
# 发现并没有出现data_1、data_2、data_3、data_4、data_5这种
# 出现的只是varchr,表明没有达到最终目的
ls()
[1] "file_name" "i" "varchr"


assign用法

1
2
3
4
5
6
Description
Assign a value to a name in an environment.

Usage
assign(x, value, pos = -1, envir = as.environment(pos),
inherits = FALSE, immediate = TRUE)

参数说明:

  • x:使用字符串表示的变量名。如果给定的是长度大于1的字符向量,那么该向量的第一个元素将被使用,并出现警告
  • value:传递给x的值
  • envir:x所在的环境,可以是.GlobalEnv表示全局变量.
    • The global environment .GlobalEnv, more often known as the user’s workspace, is the first item on the search path. It can also be accessed by globalenv(). On the search path, each item’s enclosure is the next item.

assign具体使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 先清空环境变量
rm(list=ls())

# 将data_1存储为读取了data_1.txt文件内容
for (i in 1:5){
file_name=paste0("data_",i,".txt")
assign(paste0("data_",i),read.table(file_name))
}

# 查看操作之后的环境变量,达到了目的
ls()
[1] "data_1" "data_2" "data_3" "data_4" "data_5" "file_name"
[7] "i"

# 加上envir = .GlobalEnv得到的结果相同
for (i in 1:5){
file_name=paste0("data_",i,".txt")
assign(paste0("data_",i),read.table(file_name),envir = .GlobalEnv)
}

和assign类似的list2env

list2env用法

1
2
3
4
5
6
Description
From a named list x, create an environment containing all list components as objects, or “multi-assign” from x into a pre-existing environment.

Usage
list2env(x, envir = NULL, parent = parent.frame(),
hash = (length(x) > 100), size = max(29L, length(x)))

参数说明:

  • x:列表,需要注意的是列表中每个元素必须要有有名称,即names(x)不能包含空元素
  • envirx所在的环境,同上assign中的说明

list2env具体使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# names(L)不为空
L <- list(a = 1, b = 2:4, p = pi, ff = gl(3, 4, labels = LETTERS[1:3]))
names(L)
[1] "a" "b" "p" "ff"
list2env(L, envir = .GlobalEnv)
<environment: R_GlobalEnv>
ls()
[1] "a" "b" "ff" "L" "p"

# names(L)含有空元素
L <- list( 1, b = 2:4, p = pi, ff = gl(3, 4, labels = LETTERS[1:3]))
names(L)
[1] "" "b" "p" "ff"
# 这一步报错
list2env(L, envir = .GlobalEnv)
Error in list2env(L, envir = .GlobalEnv) :
attempt to use zero-length variable name

具体到assign中的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
re_list=list()
name_vect=c()
for (i in 1:5){
file_name=paste0("data_",i,".txt")
re_list[[i]]=read.table(file_name)
name_vect=c(name_vect,paste0("data_",i))
}
names(re_list)=name_vect
re_list
$data_1
V1
1 1

$data_2
V1
1 2

$data_3
V1
1 3

$data_4
V1
1 4

$data_5
V1
1 5
list2env(re_list, envir = .GlobalEnv)
<environment: R_GlobalEnv>

ls()
[1] "data_1" "data_2" "data_3" "data_4" "data_5" "file_name"
[7] "i" "name_vect" "re_list"



得到字符串对应的变量的值-get

前面已经通过assign配合循环操作将字符串转换为变量来存储文件内容,后面如果想要通过循环操作得到字符串对应的变量的值可以使用get.

get用法

1
2
3
4
5
6
Description
Search by name for an object (get) or zero or more objects (mget).

Usage
get(x, pos = -1, envir = as.environment(pos), mode = "any",
inherits = TRUE)

参数说明:

  • x:以字符串表示的object名称
  • envir:同前面assign中的用法

get具体使用

1
2
3
4
5
6
7
8
9
10
11
12
13
for (i in 1:5){
print(get(paste0("data_",i)))
}
V1
1 1
V1
1 2
V1
1 3
V1
1 4
V1
1 5


参考链接



-----本文结束感谢您的阅读-----

本文标题:R系列之将字符串转化为变量

文章作者:showteeth

发布时间:2019年12月02日 - 17:36

最后更新:2020年01月30日 - 17:20

原始链接:http://showteeth.tech/posts/14356.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%