문자열을 변수 이름으로 변환


100

R을 사용하여 다음 형식의 문자열 목록을 구문 분석합니다.

original_string <- "variable_name=variable_value"

먼저 원래 문자열에서 변수 이름과 값을 추출하고 값을 숫자 클래스로 변환합니다.

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

그런 다음 parameter_name 문자열과 같은 이름의 변수에 값을 할당하고 싶습니다.

variable_name <- parameter_value

이를 수행하는 기능은 무엇입니까?

답변:



66

do.call을 사용할 수 있습니다.

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

10
생각에 +1. 사람들 (나를 포함)은 보통 그것이 <-기능 자체 라는 것을 잊어 버립니다 .
Rob


20

사용 x=as.name("string") 하면 x이름 문자열로 변수를 참조 하는 데 사용할 수 있습니다 .

귀하의 질문에 올바르게 대답하는지 모르겠습니다.


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

18

찾고있는 기능은 get()다음과 같습니다.

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

메모리 주소가 동일한 지 확인 :

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

참조 : R FAQ 7.21 문자열을 변수로 바꾸려면 어떻게해야합니까?


1
큰! 이것은 내가 찾은 가장 간결한 대답입니다. 반대로 수행하는 유사하게 간결한 방법이 있습니까? 단지 같은x <- 42; deparse(substitute(x))
미아오 카이

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를 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")

x6으로 변경되고 변수 이름이.이 아닌 "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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.