"R програм дээр кирилл үсэг уншигдахгүй байна. Яах вэ?" гэсэн асуулттай хэдхэн хоногийн дотор хоёронтаа тааралдлаа. Би өөрөө Юникод стандартыг бүрэн дэмждэг Linux тархацуудын нэг болох Ubuntu хэрэглэдэг болохоор кирилл үсэг, түүн дотроо ө болон ү үсэг танигдахгүй байхын зовлонтой огт нүүр тулдагггүй билээ. Ийм учраас асуудлын цаад шалтгаан тэмдэгтийн кодчилолдоо бий гэдгийг мэдэж байвч яг таг хариу өгч чаддаггүй байв. Ингээд тус асуудлын учрыг олохын тулд Windows үйлдлийн системтэй компьютер дээр зориуд ажиллаж үзэв.

Windows дээрх R програмд кирилл үсэг яагаад танигдахгүй байна вэ?

R програмын ажиллагаанд үйлдлийн системийн нөлөө их бий. Тухайлбал объектын хэмжээнээс эхлээд зэрэгцээ тооцоолол хүртэл мэдэгдэхүйц ялгаа ажиглагддаг. Үүнээс гадна монгол хэрэглэгчдийн хувьд кирилл үсэг таних эсвэл танихгүйн ялгаа тод томруун илэрдэг. Үйлдлийн системүүд улс орон, бүс нутгийн онцлогийг харгалзан үзэж огноо, тооны дүрслэл, мөнгөний нэгжийг янз бүрээр харуулах горимтой. Эдгээр нь бидний нүдэнд шууд өртдөг. Харин төдийлэн анзаараад байдаггүй нэг том ялгаа бол улс орнуудын олон янзын бичиг үсгээс шалтгаалсан текстийн кодчилолын олон хувилбарт байдал юм. R програм дээрээс эдгээрийг харъя гэвэл дараах тушаал өгнө.

Sys.getlocale()

Үйлдлийн систем дээрээ бүс нутгаа хэрхэн зааснаас шалтгаалж жишээлбэл монгол хэлний хувьд cp1251, англи хэлний хувьд cp1252 гэх мэтчилэн янз бүрийн кодчилол харуулна. Харин миний хэрэглэдэг Ubuntu Linux үйлдлийн систем дээрх R програмд дээрх тушаал өгвөл Юникод стандартын UTF-8 кодчилол ашиглаж байгааг харуулдаг. Бүс нутгийн сонголтыг өөрчлөх боломжтой бөгөөд үүнд Sys.setlocale() функц ашиглана. Ингээд Windows дээр бүс нутгийн сонголтыг "Mongolian" хэмээн өгөхөд зохих өөрчлөлт орсон боловч кодчилол өөрчлөгдөхгүй байв.

Sys.setlocale(category = "LC_ALL", locale = "Mongolian")

Мөн "Mongolian.UTF-8" бүр Linux дээрх шиг "mn_MN.UTF-8" гэж үзтэл кодчилол солигдох нь байтугай бүр ямар ч өөрчлөлт ороогүй тухай анхааруулга өгч байлаа. Тэгэхээр нь энэ талаар интернэтээс хайж үзээд Windows дээр кодчилол өөрчлөх боломжгүй гэсэн дүгнэлтэд хүрэв.

Мөн R програмын тохиргоо доторх кодчилолын параметрыг UTF-8 болгох гэх мэтээр янз бүрээр оролдож үзсэн. Эдгээр бүгдийн үр дүнг дараах хэсэгт дурдана.

Түүнчлэн RStudio програм дээр R хэлээр бичсэн код дотор кирилл үсгээр бичсэн тэмдэгт мөр эсвэл кодын тайлбар оруулъя гэвэл Global Options > Code > Saving > Default Text Encoding талбарын утгыг UTF-8 болгох нь зүйтэй болов уу.

Файлаас кирилл үсэг бүхий өгөгдөл оруулах

R програмд гадны эх үүсвэрээс текст хэлбэртэй өгөгдөл оруулахдаа тэмдэгтийн кодчилолын төрлийг заах боломж байдаг. Тухайлбал CSV файлаас өгөгдөл импортлоход түгээмэл ашигладаг read.csv() функцийн хувьд encoding гэдэг аргумент бий. Кирилл үсэг нэн ялангуяа ө болон ү үсгүүд юникод тэмдэгтийн цуглуулгад аль хэдийн багтсан тул encoding аргументаар "UTF-8" гэсэн утга дамжуулж байгаад кирилл үсэг бүхий текст мэдээлэл агуулсан файл ачаалтал яг бодож байснаар болж кирилл үсгүүд танигдав. Харин тус аргументыг арилгаж байгаад кодоо ажиллуулахад кирилл үсэг танигдахгүй арзайж байв. Тийнхүү Windows зэрэг үйлдлийн систем дээрх R програмд кирилл үсгээр шивсэн текст хэлбэртэй өгөгдөл импортлох үедээ тэмдэгтийн кодчилолыг тусгайлан зааж өгөх шаардлагатай гэдэг нь тодорхой боллоо. Тухайлбал read.csv() зэрэг функцийн хувьд дараах хэлбэртэй код бичнэ.

data <- read.csv(file = "your_file.csv", encoding = "UTF-8")

Цааш үргэлжлүүлэн янз бүрээр туршиж үзэхэд Юникод стандартын UTF-8 кодчилол бүхий кирилл үсэг агуулсан өгөгдөл импортлох болон экспортлоход "readr" зэрэг нэмэлт багц ашиглавал тохиромжтой болох нь анзаарагдаж байлаа.

Файлаас өгөгдөл импортолж оруулах үйлдлийг бүс нутгын тохиргоо болон R програмын тохиргоо дахь кодчилолын параметртэй хослуулан янз бүрээр туршихад гарсан үр дүнг товч танилцуулъя.

# Ө болон Ү үсэг хэвлэхэд асуудалтай
Sys.setlocale(category = "LC_ALL", locale = "Mongolian")
options(encoding = "native.enc")
read.csv(file = "your_file.csv", encoding = "UTF-8")
# Ө болон Ү үсэг унших үед алдаа гарна
Sys.setlocale(category = "LC_ALL", locale = "Mongolian")
options(encoding = "UTF-8")
read.csv(file = "your_file.csv")
# Кирилл үсэг хэвлэхэд асуудалтай
Sys.setlocale(category = "LC_ALL", locale = "English")
options(encoding = "native.enc")
read.csv(file = "your_file.csv", encoding = "UTF-8")
# Кирилл үсэг унших үед алдаа гарна
Sys.setlocale(category = "LC_ALL", locale = "English")
options(encoding = "UTF-8")
read.csv(file = "your_file.csv")

Ийнхүү бүс нутгийн сонголтыг "Mongolian", кодчилолыг "native.enc" гээд улмаар файлаас өгөгдөл импортлохдоо кодчилолоо заавал илүү тохиромжтой юм гэсэн дүгнэлтэд хүрлээ. Мөн энд ачаалсан өгөгдлөө датафрейм байдлаар бүхлээр хэвлэх болон датафреймын нэг баганын утга буюу вектор байдлаар салган авч хэвлэх нь кирилл ө ба ү үсгийн хувьд ялгаатай байна. Үүний шалтгаан бол print() функц нь хэвлэх объектынхоо класст харгалзах тусгай функцийг дууддаг буюу классаараа ялгаатай объект бүрийн хэвлэх функц өөр өөр байдаг явдал юм.

R програмын нэмэлт багц ба үсэг, тэмдэгтийн кодчилол

Гуравдагч этгээд хөгжүүлсэн багцуудын хувьд Юникод стандартыг бүрэн тусгаагүй явдал байж болох бөгөөд үүнээс болж тэдгээр багцыг хэрэглэх үед монгол кирилл үсэг болон зарим тэмдэгтийг буруу зөрүү таних явдал тохиолдож болно. Жишээлбэл миний хөгжүүлсэн NSO1212 багц дотор ашигласан rawToChar() функц үйлдлийн системийн бүс нутгийн сонголтоос хамаарч Юникод стандартынхаас өөр кодчилолоор үсэг, тэмдэгт боловсруулж байсныг нь кодчилолоо тусгайлан зааж болдог өөр нэг функцээр сольж байв. Ийнхүү солихоос өмнө тус багцыг Windows дээр хэрэглэж байсан хүмүүст бэрхшээлтэй байсан нь мэдээжийн хэрэг юм. Үнэхээр Үндэсний статистикийн хорооны 1212 нээлттэй мэдээллийн API-гаас ирсэн мэдээллийг UTF-8-аар кодчилсон байтал огт өөр cp1251 эсвэл cp1252-оор кодчилолоор хөрвүүлэхээр кирилл үсэг танигдахгүй байх нь аргагүй юм.