我使用R来解析表单中的字符串列表:
original_string <- "variable_name=variable_value"
首先,我从原始字符串中提取变量名称和值,并将值转换为数字类。
parameter_value <- as.numeric("variable_value")
parameter_name <- "variable_name"
然后,我想将值赋给一个与parameter_name字符串同名的变量。
variable_name <- parameter_value
这样做的功能是什么?
答案 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
答案 6 :(得分:5)
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
"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.numeric
和variable_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()