将字符串转换为变量名称

时间:2011-05-17 17:22:27

标签: string r

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

original_string <- "variable_name=variable_value"

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

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

然后,我想将值赋给一个与parameter_name字符串同名的变量。

variable_name <- parameter_value

这样做的功能是什么?

11 个答案:

答案 0 :(得分:108)

分配是您正在寻找的。
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

答案 1 :(得分:58)

您可以使用do.call:

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

答案 2 :(得分:41)

还有另一个简单的解决方案: 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"

答案 3 :(得分:15)

使用x = as.name(“string”) 你可以使用x然后用名称字符串来引用变量。

如果它能正确回答你的问题我不知道

答案 4 :(得分:10)

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()

答案 5 :(得分:8)

您正在寻找的功能是get()

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

确认内存地址相同:

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

参考:R FAQ 7.21 How can I turn a string into a variable?

答案 6 :(得分:5)

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

"x"将更改为6,如果变量名称不是FORFILES /p "%CSV_Path%" /m "*.csv" /c "cmd /c SQLCMD -S %db_server% -d %db% -E -i scripts\LoadStationCsv.sql -o LoadStationCsv.log -v TempTable = ##Dayparts CsvPath = @PATH" ,则该变量同样会更改为6.

答案 7 :(得分:1)

由于您的示例简单,也许我没正确理解您的问题。据我了解,您有一系列存储在字符向量中的指令,这些指令非常接近正确格式化的格式,只是您希望将正确的成员转换为数字。

如果我的理解是正确的,我想提出一种略有不同的方法,该方法不依赖于拆分原始字符串,而是直接评估您的指令(有所改进)。

"linked_entity"

基本上,我们正在做的是“改善”您的指令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.numericvariable_name=as.numeric("10")管道等效-流语法。然后我们在当前环境中评估此表达式。

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

{{1}}

答案 10 :(得分:0)

除了 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()