স্ট্রিংকে একটি ভেরিয়েবল নামে রূপান্তর করুন


103

আমি ফর্মটিতে স্ট্রিংগুলির একটি তালিকা পার্স করার জন্য আর ব্যবহার করছি:

original_string <- "variable_name=variable_value"

প্রথমে, আমি আসল স্ট্রিং থেকে ভেরিয়েবলের নাম এবং মানটি বের করি এবং মানটিকে সংখ্যার শ্রেণিতে রূপান্তর করি।

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

তারপরে, আমি প্যারামিটার_নাম স্ট্রিংয়ের মতো একই নামের সাথে একটি ভেরিয়েবলের মান নির্ধারণ করতে চাই।

variable_name <- parameter_value

এটি করার জন্য ফাংশনটি কী / কী?

উত্তর:


128

আপনি যা সন্ধান করছেন তা নির্ধারণ করুন।

assign("x", 5)

x
[1] 5

কিন্তু ক্রেতা সাবধান।

আর প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী 7,21 দেখুন http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f


4
"ক্রেতা সাবধান" একটি বলার উপায় যে আপনার প্রায় কখনও এটি করা উচিত নয়, কারণ এটি কখনই কোনও প্রদত্ত সমস্যার একটি ভাল সমাধান নয়।
কনরাড রুডল্ফ

এই সমাধানটি ব্যবহার করার আগে, আপনি একটি তালিকা তৈরি parameter_list <- list()করে একটি মান যুক্ত করার বিষয়টি বিবেচনা করতে পারেন paramter_list[parameter_name] <- parameter_value
নাট

72

আপনি do.call ব্যবহার করতে পারেন:

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

14
ভাবনার জন্য +1 লোকেরা (আমাকে অন্তর্ভুক্ত) সাধারণত ভুলে যায় যে <-এটি একটি ফাংশন।
রব


20

x=as.name("string") আপনি ব্যবহার করতে পারেন তারপর xনাম স্ট্রিং সহ ভেরিয়েবল উল্লেখ করতে ব্যবহার করতে পারেন ।

যদি এটি আপনার প্রশ্নের সঠিক উত্তর দেয় তবে আমি জানি না un



18

আপনি যে ফাংশনটি সন্ধান করছেন তা হ'ল get():

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

মেমরি ঠিকানাটি অভিন্ন বলে নিশ্চিত করা:

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

রেফারেন্স: আর এফএকিউ 7.21 আমি কীভাবে একটি স্ট্রিংকে ভেরিয়েবলে পরিণত করতে পারি?


4
দুর্দান্ত! এটি আমার কাছে পাওয়া সবচেয়ে সংক্ষিপ্ত উত্তর। বিপরীতে কি একইভাবে সংক্ষিপ্ত উপায় আছে? ঠিক যেমন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")

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]এটি 'জান' ফেরত দেয়। এই চারপাশে কাজ করার জন্য, আপনাকে এটি করা দরকার print(get(varnames[1]))


1

আপনার উদাহরণটির সরলতার কারণে হয়তো আমি আপনার সমস্যাটি ঠিক বুঝতে পারি নি। আমার বোঝার জন্য, আপনার কাছে চরিত্রের ভেক্টরগুলিতে একাধিক নির্দেশাবলী সঞ্চিত রয়েছে এবং সেই নির্দেশাবলী সঠিকভাবে ফর্ম্যাট হওয়ার খুব কাছাকাছি, আপনি সঠিক সদস্যকে সংখ্যায় ফেলতে চান like

যদি আমার বোঝাপড়াটি সঠিক হয়, আমি কিছুটা ভিন্ন পদ্ধতির প্রস্তাব দিতে চাই, এটি আপনার মূল স্ট্রিংকে বিভক্ত করার উপর নির্ভর করে না, তবে সরাসরি আপনার নির্দেশকে মূল্যায়ন করে (কিছুটা উন্নতি করে)।

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.