将字符串转换为变量名

131

我正在使用 R 解析一个以如下形式呈现的字符串列表:

original_string <- "variable_name=variable_value"

首先,我从原始字符串中提取变量名称和变量值,并将值转换为数值类。

parameter_value <- as.numeric("variable_value")
parameter_name <- "variable_name"

接下来,我想将这个值分配给与parameter_name字符串相同名称的变量。

variable_name <- parameter_value
这要用哪些函数来完成?
11个回答

147

2
“买家需谨慎”是一种相当平淡无奇的说法,意思是你几乎永远不应该这么做,因为它几乎从来不是解决问题的好方法。 - Konrad Rudolph
在使用此解决方案之前,您可能需要创建一个列表 parameter_list <- list() 并添加一个值 paramter_list[parameter_name] <- parameter_value - Nat
这个解决方案仅适用于当前环境。这意味着,如果您想将变量设置为全局变量,您需要将该语句放在可以全局访问的位置。但是,如果您的语句位于函数内部但仍希望将变量设置为全局变量,则下面Adam的解决方案可以解决问题。 - Abel Callejo

81
你可以使用do.call函数:
 do.call("<-",list(parameter_name, parameter_value))

16
+1 认同思路。人们(包括我在内)通常会忘记 <- 本身也是一个函数。 - Rob

68

39

3
好的!这是我找到的最简洁的答案。有没有一种类似简洁的方法来做相反的事情?就像x <- 42; deparse(substitute(x))一样。 - Miao Cai

24

使用x=as.name("string")。然后可以使用x引用名称为string的变量。

我不知道这是否正确回答了你的问题。


4
x=as.symbol("string") - Enrique Pérez Herrero

11

使用 strsplit 解析你的输入,就像 Greg 提到的那样,使用 assign 分配变量。

original_string <- c("x=123", "y=456")
pairs <- strsplit(original_string, "=")
lapply(pairs, function(x) assign(x[1], as.numeric(x[2]), envir = globalenv()))
ls()

6
assign很好用,但我还没有找到一个函数可以引用你在自动脚本中创建的变量(as.name似乎是相反的)。更有经验的编码人员无疑会有更好的解决方案,但这个解决方案有效且有点幽默,因为它让R为自己编写要执行的代码。
假设我刚刚把值5分配给了xvar.name <- "x"; assign(var.name, 5)),我想把它改成6。如果我正在编写一个脚本,并且不知道变量名(var.name)将是什么(这似乎是assign函数的重点),我不能简单地放置x <- 6,因为var.name可能是"y"。所以我这样做:
var.name <- "x"
#some other code...
assign(var.name, 5)
#some more code...

#write a script file (1 line in this case) that works with whatever variable name
write(paste0(var.name, " <- 6"), "tmp.R")
#source that script file
source("tmp.R")
#remove the script file for tidiness
file.remove("tmp.R")

x将被更改为6,如果变量名称不是"x",那么该变量也会类似地更改为6。


2

我几天前正在处理这个问题,发现有时需要使用get()函数来输出变量的结果。例如:

varnames = c('jan', 'feb', 'march')
file_names = list_files('path to multiple csv files saved on drive')
assign(varnames[1], read.csv(file_names[1]) # This will assign the variable

从这里开始,如果您尝试打印变量varnames [1],它会返回“jan”。 为了解决这个问题,您需要执行 print(get(varnames [1]))


2
如果您想在函数体内将字符串转换为变量,但同时希望该变量成为全局变量:
test <- function() {
do.call("<<-",list("vartest","xxx"))
}
test()
vartest

[1] "xxx"

1
除了使用assign之外,给字符串命名的对象赋值的另一种方法是直接访问.GlobalEnv
# Equivalent
assign('abc',3)

.GlobalEnv$'abc' = 3

访问.GlobalEnv可以提供一定的灵活性,我的用例是为一个以字符串命名的列表分配值。例如:

.GlobalEnv$'x' = list()
.GlobalEnv$'x'[[2]] = 5 # works

var = 'x'
.GlobalEnv[[glue::glue('{var}')]][[2]] = 5 # programmatic names from glue()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接