Saya seorang pemula untuk R, dan saya cukup bingung dengan penggunaan variabel lokal dan global dalam R.
Saya membaca beberapa posting di internet yang mengatakan apakah saya menggunakan =
atau <-
saya akan menetapkan variabel di lingkungan saat ini, dan dengan <<-
saya dapat mengakses variabel global ketika berada di dalam suatu fungsi.
Namun, seperti yang saya ingat di C ++ variabel lokal muncul setiap kali Anda mendeklarasikan variabel di dalam tanda kurung {}
, jadi saya ingin tahu apakah ini sama untuk R? Atau hanya untuk fungsi - fungsi dalam R yang kita punya konsep variabel lokal.
Saya melakukan sedikit percobaan, yang tampaknya menyarankan bahwa hanya kurung saja tidak cukup, apakah saya mendapatkan kesalahan?
{
x=matrix(1:10,2,5)
}
print(x[2,2])
[1] 4
globalenv(); globalenv() %>% parent.env; globalenv() %>% parent.env %>% parent.env
,…Error: could not find function "%>%"
,. Apakah itu bentuk tugas lain?require(magrittr)
. Ini adalah cara menerapkan fungsi di sebelah kanan (x | f1 | f2 | f3
) alih-alih di sebelah kiri (f3( f2( f1( x ) ) )
).Jawaban:
Variabel yang dideklarasikan di dalam suatu fungsi adalah lokal untuk fungsi itu. Misalnya:
memberikan error berikut:
Error: object 'bar' not found
.Jika Anda ingin membuat
bar
variabel global, Anda harus melakukan:Dalam hal
bar
ini dapat diakses dari luar fungsi.Namun, tidak seperti C, C ++ atau banyak bahasa lain, tanda kurung tidak menentukan ruang lingkup variabel. Misalnya, dalam cuplikan kode berikut:
y
tetap dapat diakses setelahif-else
pernyataan.Seperti yang Anda katakan, Anda juga dapat membuat lingkungan bersarang. Anda dapat melihat kedua tautan ini untuk memahami cara menggunakannya:
Di sini Anda memiliki contoh kecil:
sumber
<-
melakukan penugasan di lingkungan saat ini.Saat Anda berada di dalam fungsi R menciptakan lingkungan baru untuk Anda. Secara default itu mencakup segala sesuatu dari lingkungan di mana ia dibuat sehingga Anda dapat menggunakan variabel-variabel itu juga, tetapi apa pun yang Anda buat tidak akan ditulis ke lingkungan global.
Dalam kebanyakan kasus
<<-
akan menetapkan variabel yang sudah ada di lingkungan global atau membuat variabel di lingkungan global bahkan jika Anda berada di dalam suatu fungsi. Namun, tidak sesederhana itu. Apa yang dilakukannya adalah memeriksa lingkungan induk untuk variabel dengan nama yang menarik. Jika tidak menemukannya di lingkungan induk Anda, ia pergi ke induk dari lingkungan induk (pada saat fungsi dibuat) dan terlihat di sana. Itu terus ke atas ke lingkungan global dan jika tidak ditemukan di lingkungan global itu akan menetapkan variabel di lingkungan global.Ini mungkin menggambarkan apa yang sedang terjadi.
Pertama kali kami mencetak bilah yang belum kami panggil,
foo
maka itu harus tetap bersifat global - ini masuk akal. Kedua kalinya kami mencetaknyafoo
sebelum meneleponbaz
sehingga nilai "in foo" masuk akal. Berikut ini adalah di mana kita melihat apa<<-
yang sebenarnya dilakukan. Nilai berikutnya yang dicetak adalah "dalam baz - sebelum << -" meskipun pernyataan cetak muncul setelah<<-
. Ini karena<<-
tidak terlihat di lingkungan saat ini (kecuali jika Anda berada di lingkungan global di mana kasing<<-
bertindak<-
). Jadi dibaz
dalam nilai bar tetap sebagai "in baz - before << -". Setelah kita memanggilbaz
salinan bilah di dalamfoo
diubah menjadi "dalam baz" tetapi seperti yang kita lihat globalbar
tidak berubah.bar
yang didefinisikan di dalamfoo
berada di lingkungan induk ketika kami membuatbaz
jadi ini adalah salinan pertama daribar
yang<<-
melihat dan dengan demikian salinan yang ditugaskan kepadanya. Jadi<<-
bukan hanya secara langsung menugaskan ke lingkungan global.<<-
itu rumit dan saya tidak akan merekomendasikan menggunakannya jika Anda dapat menghindarinya. Jika Anda benar-benar ingin menetapkan ke lingkungan global, Anda dapat menggunakan fungsi tetapkan dan katakan secara eksplisit bahwa Anda ingin menetapkan secara global.Sekarang saya mengubah
<<-
ke pernyataan penetapan dan kita dapat melihat apa efeknya:Jadi kedua kali kita mencetak bilah di
foo
dalam nilainya "di foo" bahkan setelah meneleponbaz
. Ini karenaassign
bahkan tidak pernah mempertimbangkan salinan bagianbar
dalam foo karena kami mengatakannya ke mana harus mencari. Namun, kali ini nilai bar di lingkungan global berubah karena kami secara eksplisit ditugaskan di sana.Sekarang Anda juga bertanya tentang membuat variabel lokal dan Anda dapat melakukannya dengan cukup mudah tanpa membuat fungsi ... Kita hanya perlu menggunakan
local
fungsi.sumber
Sedikit lagi di jalur yang sama
akan mencetak "1"
Akan mencetak "20"
sumber