আর তে গ্লোবাল এবং স্থানীয় ভেরিয়েবল


126

আমি আর এর জন্য নবাগত এবং আমি আর এর স্থানীয় এবং গ্লোবাল ভেরিয়েবলের ব্যবহার নিয়ে যথেষ্ট বিভ্রান্ত am

আমি ইন্টারনেটে কিছু পোস্ট পড়েছি যা বলে যে আমি ব্যবহার করি =বা <-আমি বর্তমান পরিবেশে ভেরিয়েবলটি নির্ধারিত করব এবং <<-কোনও ফাংশনের অভ্যন্তরে যখন আমি একটি বৈশ্বিক পরিবর্তনশীল অ্যাক্সেস করতে পারি।

যাইহোক, আমি যেমন মনে করি সি ++ তে স্থানীয় ভেরিয়েবলগুলি উত্থাপিত হয় যখনই আপনি বন্ধনীর ভিতরে ভেরিয়েবল ঘোষণা করেন {}, তাই আমি ভাবছি যে এটি আর এর জন্য একই কিনা? বা এটি কেবল আর এর ফাংশনগুলির জন্য যে আমাদের কাছে স্থানীয় ভেরিয়েবলের ধারণা রয়েছে।

আমি একটি সামান্য পরীক্ষা করেছিলাম, যা মনে হয় যে কেবল বন্ধনী যথেষ্ট নয়, আমি কি কিছু ভুল করছি?

{
   x=matrix(1:10,2,5)
}
print(x[2,2])
[1] 4

কিছু কোড এর উত্তরগুলি ছাড়াও চালানোর জন্য: globalenv(); globalenv() %>% parent.env; globalenv() %>% parent.env %>% parent.env...
isomorphismes

@ আইসোমরফিসমিস Error: could not find function "%>%",। এ্যাসাইনমেন্টের কি অন্য রূপ?
অ্যারন ম্যাকডেইড

1
আর-সহায়তা সম্পর্কিত প্রাসঙ্গিক থ্রেড: "<< -" অপারেটরের অর্থ কী?
হেনরিক

1
অ্যারোন এমসিডেড হাই, শিগগির সাড়া না দেওয়ার জন্য দুঃখিত! যে থেকে হয় require(magrittr)। এটি x | f1 | f2 | f3বামদিকে ( f3( f2( f1( x ) ) )) পরিবর্তে ডানদিকে ( ) ফাংশন প্রয়োগ করার একটি উপায় ।
isomorphismes

উত্তর:


153

কোনও ফাংশনের অভ্যন্তরে ঘোষিত ভেরিয়েবলগুলি সেই ফাংশনের স্থানীয়। এই ক্ষেত্রে:

foo <- function() {
    bar <- 1
}
foo()
bar

নিম্নলিখিত ত্রুটির দেয়: Error: object 'bar' not found

আপনি যদি barবিশ্বব্যাপী পরিবর্তনশীল করতে চান তবে আপনার করা উচিত:

foo <- function() {
    bar <<- 1
}
foo()
bar

এই ক্ষেত্রে barফাংশন বাইরে থেকে অ্যাক্সেসযোগ্য।

তবে, সি, সি ++ বা অন্যান্য অনেকগুলি ভাষা থেকে ভিন্ন, বন্ধনীগুলি ভেরিয়েবলের ক্ষেত্র নির্ধারণ করে না। উদাহরণস্বরূপ, নিম্নলিখিত কোড স্নিপেটে:

if (x > 10) {
    y <- 0
}
else {
    y <- 1
}

yif-elseবিবৃতি পরে অ্যাক্সেসযোগ্য থাকে ।

আপনি যেমন বলেছেন ঠিক তেমন, আপনি নেস্টেড পরিবেশও তৈরি করতে পারেন। কীভাবে এটি ব্যবহার করতে হয় তা বোঝার জন্য আপনি এই দুটি লিঙ্কটি একবার দেখে নিতে পারেন:

  1. http://stat.ethz.ch/R-manual/R-devel/library/base/html/environment.html
  2. http://stat.ethz.ch/R-manual/R-devel/library/base/html/get.html

এখানে আপনার একটি ছোট উদাহরণ রয়েছে:

test.env <- new.env()

assign('var', 100, envir=test.env)
# or simply
test.env$var <- 100

get('var') # var cannot be found since it is not defined in this environment
get('var', envir=test.env) # now it can be found

136

<- বর্তমান পরিবেশে অ্যাসাইনমেন্ট করে।

যখন আপনি কোনও ফাংশনের ভিতরে থাকবেন তখন আর আপনার জন্য একটি নতুন পরিবেশ তৈরি করে। ডিফল্টরূপে এটি যে পরিবেশে তৈরি হয়েছিল তার সমস্ত কিছু অন্তর্ভুক্ত করে তাই আপনি সেই পরিবর্তনশীলগুলিও ব্যবহার করতে পারেন তবে নতুন কিছু যা আপনি তৈরি করেন তা বৈশ্বিক পরিবেশে লেখা হবে না।

অধিকাংশ ক্ষেত্রে <<- বৈশ্বিক পরিবেশে ইতিমধ্যে ভেরিয়েবলগুলি অর্পণ করা হবে বা আপনি কোনও ফাংশনের অভ্যন্তরে থাকলেও বৈশ্বিক পরিবেশে একটি পরিবর্তনশীল তৈরি করবেন। যাইহোক, এটি যে হিসাবে খুব সহজ না। এটি যা করে তা হ'ল আগ্রহের নামের সাথে একটি ভেরিয়েবলের জন্য প্যারেন্ট পরিবেশকে পরীক্ষা করে। যদি এটি আপনার পিতামহুল পরিবেশে এটি খুঁজে না পায় তবে এটি পিতা-মাতৃ পরিবেশের পিতামাতার কাছে যায় (ফাংশনটি তৈরি করার সময়) এবং সেখানে দেখায়। এটি বৈশ্বিক পরিবেশে wardর্ধ্বমুখী অব্যাহত থাকে এবং এটি যদি বৈশ্বিক পরিবেশে খুঁজে না পাওয়া যায় তবে এটি বৈশ্বিক পরিবেশে পরিবর্তনশীল নির্ধারণ করবে।

এটি যা চলছে তা চিত্রিত করে।

bar <- "global"
foo <- function(){
    bar <- "in foo"
    baz <- function(){
        bar <- "in baz - before <<-"
        bar <<- "in baz - after <<-"
        print(bar)
    }
    print(bar)
    baz()
    print(bar)
}
> bar
[1] "global"
> foo()
[1] "in foo"
[1] "in baz - before <<-"
[1] "in baz - after <<-"
> bar
[1] "global"

প্রথমবার আমরা বারটি প্রিন্ট করেছি আমরা fooএখনও কল করি নি তাই এটি এখনও বিশ্বব্যাপী হওয়া উচিত - এটি অর্থবোধ করে। দ্বিতীয়বার fooকল bazকরার আগে আমরা এর ভিতরে দ্বিতীয়বার মুদ্রণ করি যাতে "foo এ" মানটি বোঝায়। নিম্নলিখিতটি যেখানে আমরা দেখছি <<-আসলে কী করছে। পরবর্তী মান মুদ্রিত হয় "বাজে - << - এর আগে" যদিও মুদ্রণ বিবৃতিটি পরে আসে <<-। এটি কারণ <<-বর্তমান পরিবেশে সন্ধান করে না (যদি আপনি বিশ্বব্যাপী পরিবেশে না থাকেন তবে ক্ষেত্রে এটি <<-পছন্দ করে <-)। সুতরাং bazবারের মানটি "বাজে - << - এর আগে" হিসাবে থাকে। একবার যখন আমরা bazবারের অনুলিপিটি কল করি তখন foo"ইন বাজে" হয়ে যায় তবে আমরা দেখতে পাই যে বিশ্বব্যাপী barঅপরিবর্তিত রয়েছে।barভেতরে সংজ্ঞায়িত করা হয় যে fooপিতা বা মাতা পরিবেশে যখন আমরা তৈরি bazতাই এই প্রথম কপি barকরে <<-দেখেন এবং এইভাবে কপি এটি নির্ধারণ করা হয়। সুতরাং <<-সরাসরি বৈশ্বিক পরিবেশের জন্য বরাদ্দ নয়।

<<-জটিল এবং আপনি যদি এড়াতে পারেন তবে আমি এটি ব্যবহার করার পরামর্শ দেব না। আপনি যদি সত্যই বিশ্বব্যাপী পরিবেশে নির্ধারিত করতে চান তবে আপনি নির্ধারিত কার্যটি ব্যবহার করতে পারেন এবং এটি স্পষ্টভাবে বলতে পারেন যে আপনি বিশ্বব্যাপী বরাদ্দ করতে চান।

এখন আমি <<-একটি অ্যাসাইনমেন্ট বিবৃতিতে পরিবর্তন করেছি এবং আমরা দেখতে পাচ্ছি এর কী প্রভাব রয়েছে:

bar <- "global"
foo <- function(){
    bar <- "in foo"   
    baz <- function(){
        assign("bar", "in baz", envir = .GlobalEnv)
    }
    print(bar)
    baz()
    print(bar)
}
bar
#[1] "global"
foo()
#[1] "in foo"
#[1] "in foo"
bar
#[1] "in baz"

সুতরাং উভয় সময় আমরা কলটির fooপরেও মানটির ভিতরে বার মুদ্রণ করি "ইন ফু" baz। এটি এর কারণ হিসাবে assignকখনও কখনও অনুলিপি বিবেচনা করেনিbar কারণ আমরা এটি কোথায় দেখতে হবে তা ঠিক জানিয়েছি। তবে, এবার বৈশ্বিক পরিবেশে বারের মান পরিবর্তন করা হয়েছিল কারণ আমরা সেখানে স্পষ্টভাবে নির্ধারিত করেছি।

এখন আপনি স্থানীয় ভেরিয়েবলগুলি তৈরি করার বিষয়ে জিজ্ঞাসা করেছিলেন এবং কোনও ফাংশন তৈরি না করে আপনি এটি মোটামুটি সহজেই করতে পারেন ... আমাদের কেবল localফাংশনটি ব্যবহার করা দরকার ।

bar <- "global"
# local will create a new environment for us to play in
local({
    bar <- "local"
    print(bar)
})
#[1] "local"
bar
#[1] "global"

2

একই লাইন বরাবর আরও কিছু

attrs <- {}

attrs.a <- 1

f <- function(d) {
    attrs.a <- d
}

f(20)
print(attrs.a)

"1" মুদ্রণ করবে

attrs <- {}

attrs.a <- 1

f <- function(d) {
   attrs.a <<- d
}

f(20)
print(attrs.a)

"20" মুদ্রণ করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.