स्ट्रिंग को एक चर नाम में बदलें


100

मैं फार्म में तार की एक सूची पार्स करने के लिए आर का उपयोग कर रहा हूं:

original_string <- "variable_name=variable_value"

सबसे पहले, मैं चर नाम और मूल स्ट्रिंग से मान निकालता हूं और मूल्य को संख्यात्मक वर्ग में परिवर्तित करता हूं।

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

फिर, मैं एक चर के मान को उसी नाम के साथ असाइन करना चाहूंगा, जैसे पैरामीटर_नाम स्ट्रिंग।

variable_name <- parameter_value

ऐसा करने के लिए क्या कार्य / कार्य हैं?

जवाबों:


122

असाइन करें जिसे आप खोज रहे हैं।

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


"क्रेता खबरदार" यह कहने का एक बड़ा दोषपूर्ण तरीका है कि आपको लगभग कभी ऐसा नहीं करना चाहिए, क्योंकि यह किसी समस्या का एक अच्छा समाधान नहीं है।
कोनराड रुडोल्फ

66

आप do.call का उपयोग कर सकते हैं:

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

10
सोचने के लिए +1। लोग (मुझे शामिल) आमतौर पर भूल जाते हैं कि <-यह एक कार्य है।
रोब


20

उपयोग x=as.name("string") आप उपयोग कर सकते हैं तो xनाम स्ट्रिंग के साथ चर को संदर्भित करने के लिए उपयोग कर सकते हैं ।

अगर यह आपके प्रश्न का सही उत्तर देता है तो मुझे पता नहीं है



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अपने इनपुट को पार्स करने के लिए, और ग्रेग के रूप में, 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विपरीत तरीके से काम करने लगता है)। अधिक अनुभवी कोडर निस्संदेह एक बेहतर समाधान होगा, लेकिन यह समाधान काम करता है और शायद थोड़ा विनोदी है, जिसमें इसे निष्पादित करने के लिए अपने लिए आर लिखने के लिए आर मिलता है।

मान लें कि मैंने अभी 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 में बदल दिया जाएगा।


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], तो यह 'जन' देता है। इसके आसपास काम करने के लिए, आपको करने की आवश्यकता है 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"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.