将字符串转换为变量名


100

我正在使用R解析以下形式的字符串列表:

original_string <- "variable_name=variable_value"

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

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

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

variable_name <- parameter_value

进行此操作的功能是什么?

Answers:



66

您可以使用do.call:

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

10
+1思考。人们(包括我在内)通常会忘记<-函数本身。
罗布




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

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


1

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

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

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年后在这里闲逛的人有所帮助;-)


0

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

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

[1] "xxx"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.