将字符串转换为变量名

我使用 R 来解析表单中的字符串列表:

original_string <- "variable_name=variable_value"

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

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

然后,我希望将值赋给与 parameter_name字符串同名的变量。

variable_name <- parameter_value

这样做的函数是什么?

249928 次浏览

分配是你正在寻找的。

assign("x", 5)


x
[1] 5

但买家要小心。

见 R FAQ 7.21 Http://cran.r-project.org/doc/faq/r-faq.html#how-can-i-turn-a-string-into-a-variable_003f

strsplit解析您的输入,正如格雷格提到的,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()

你可以使用 do.call:

 do.call("<-",list(parameter_name, parameter_value))

使用 x=as.name("string")。然后可以使用 x来引用具有名称字符串的变量。

I don't know, if it answers your question correctly.

assign很好,但是我还没有找到一个函数来引用您在自动脚本中创建的变量。(as.name似乎以相反的方式工作)。更有经验的程序员无疑会有一个更好的解决方案,但是这个解决方案可以工作,并且可能有点幽默,因为它让 R 为自己编写代码来执行。

假设我刚刚将值5赋给了 x(var.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。

还有一个简单的解决办法: Http://www.r-bloggers.com/converting-a-string-to-a-variable-name-on-the-fly-and-vice-versa-in-r/

将字符串转换为变量:

x <- 42
eval(parse(text = "x"))
[1] 42

恰恰相反:

x <- 42
deparse(substitute(x))
[1] "x"

你要找的函数是 get():

assign ("abc",5)
get("abc")

确认内存地址相同:

getabc <- get("abc")
pryr::address(abc) == pryr::address(getabc)
# [1] TRUE

参考资料: R FAQ 7.21如何将字符串转换为变量?

几天前我正在处理这个问题,注意到有时需要使用 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]))

如果希望将字符串转换为函数体内的变量,但是希望变量是全局的:

test <- function() {
do.call("<<-",list("vartest","xxx"))
}
test()
vartest


[1] "xxx"

Maybe I didn't understand your problem right, because of the simplicity of your example. To my understanding, you have a series of instructions stored in character vectors, and those instructions are very close to being properly formatted, except that you'd like to cast the right member to numeric.

如果我的理解是正确的,我想提出一种稍微不同的方法,它不依赖于分割原始字符串,而是直接评估指令(稍作改进)。

original_string <- "variable_name=\"10\"" # Your original instruction, but with an actual numeric on the right, stored as character.
library(magrittr) # Or library(tidyverse), but it seems a bit overkilled if the point is just to import pipe-stream operator
eval(parse(text=paste(eval(original_string), "%>% as.numeric")))
print(variable_name)
#[1] 10

基本上,我们所做的就是“改进”指令 variable_name="10",使其成为 variable_name="10" %>% as.numeric,这是 variable_name=as.numeric("10")magrittr管道流语法的等价物。然后我们在当前环境中计算这个表达式。

希望这能帮助那些8年后在这里闲逛的人; -)

除了 assign之外,给字符串命名对象赋值的另一种方法是直接访问 .GlobalEnv

# Equivalent
assign('abc',3)


.GlobalEnv$'abc' = 3

Accessing .GlobalEnv gives some flexibility, and my use case was assigning values to a string-named list. For example,

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


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