Hogy könnyebb legyen elképzelni, nézzünk is egy konkrét példát erre! Én jelenleg a hitbizományokkal foglalkozom. Ezek olyan speciális jogállású földbirtokok voltak, amelyek általában elsőszülöttségi rendben öröklődtek egy-egy családon belül, és nem lehetett eladni vagy megcsonkítani őket. A pillanatnyi birtokos tehát nem a tulajdonosa, csak a haszonélvezője volt a hitbizománynak.

Az adatbázisomban minden hitbizomány egyedi azonosítóval rendelkezik, és ehhez az ID-hez rögzítem a különböző adatokat. Például azokat a településeket, ahol az adott hitbizományhoz tartozó földbirtokok elterültek, vagy azokat a személyeket, akik alapítóként vagy haszonélvezőként kapcsolódtak ahhoz.

Az e blogposzt megírását inspiráló probléma az a kívánalom volt, hogy menet közben egy térképre vetítve azonnal láthassam a már felrögzített településeket, illetve az alapítók/haszonélvezők genealógiai kapcsolathálózatát. Anélkül, hogy különböző lekérdezések vagy R nyelven írt kódok manuális alakítgatásával és futtatásával kellene szórakoznom. A célkitűzés itt az, hogy egy gomb megnyomására állítódjon elő a végeredmény az aktuálisan szerkesztett hitbizományra vonatkozóan.

Az első ábrán három különböző hitbizományhoz tartozó térkép előállítása látható. Ezek JPG képként jönnek létre és a rendszer alapértelmezett képnézegetőjével nyílnak meg automatikusan.

Az aktuális hitbizományhoz tartozó települések térképre vetítve

A második ábrán pedig egy genealógiai kapcsolathálózatot generáltatok le egy adott hitbizomány haszonélvezőiből. Ez GEXF formátumban jön létre és a Gephiben nyílik meg.

Az aktuális hitbizományhoz tartozó alapítók/haszonélvezők hálózatának előállítása

Hogyan hívhatjuk meg az R-t az Access-ből?

Az alábbiakban természetesen nem térképek és genealógiai kapcsolathálózatok előállításáról lesz szó, hiszen ezek az én saját kutatási problémám részét képezik. Általánosítva mutatom meg azt, hogy miként lehet meghívni az R-t az Access-ből.

A megvalósítás menete a következő:

  1. Először az Access-ben elhelyezünk egy gombot a kérdéses űrlapon.

  2. Ezt megnyomva egy VBA nyelven írt kódsor elindítja az R parancsértelmezőjét (Rscript) és átadja neki az általunk vizsgált entitás ID-jét, valamint annak az R nyelven írt algoritmusnak – R kiterjesztéssel elmentett szöveges fájlnak – az elérési útvonalát, amely elvégzi majd a szükséges számításokat és manipulációkat. Az ID ebben az esetben egy olyan szám vagy karakterlánc, ami egyedileg azonosít valakit vagy valamit. Például egy személyt, egy családot, egy települést, egy földbirtokot, egy tevékenységet. Bármit, amit érdemes egyedileg azonosítani.

  3. Ettől kezdve a feladat végrehajtása átkerül az R-hez. Megjegyzendő azonban, hogy maga kód, amit futtatunk, nyilvánvalóan teljes mértékben problémaspecifikus. Itt nincs általános recept, ezt az adott kutatási feladatnak megfelelően kell leprogramozni. Ugyanakkor biztosra vehetjük, hogy az átadott ID-n kívül további adatokra lesz szükségünk az Access-ből. A szükséges táblákhoz ODBC kapcsolaton keresztül tudunk hozzáférni. Ennek menetét a belinkelt posztban részletesen leírtam.
    A kód futtatása során remélhetőleg létrejön a vágyott végeredmény. Ez nemcsak kép vagy hálózat lehet, hanem például egy Excel táblázat, szöveges fájl, PDF dokumentum is. Tulajdonképpen akármi, ami R nyelven előállítható a rendelkezésre álló adatainkból. A végeredményként megkapott fájlt elmentjük valahová, majd az operációs rendszerünkben alapértelmezettként beállított alkalmazással automatikusan megnyitjuk azt.

Nézzük meg a fenti három lépést a gyakorlatban is!

1. A gomb hozzáadása az Access űrlaphoz

Az adatbázisunkban nyissuk meg az űrlapot, majd a jobb alsó sarokban található ikonok közül válasszuk a Tervező nézetet. Ezt követően az Űrlaptervezés eszköztárban megtaláljuk azokat a vezérlőelemeket, amelyeket hozzáadhatunk az adott űrlaphoz. Itt kattintsunk a Gomb lehetőségre, majd az egérrel rajzoljunk egy négyzetet az űrlap szerkeszthető felületére. Végül a megjelenő párbeszédablakban kattintsunk a Mégse gombra. Ezzel létre is jött a parancsgombunk. (Az Access űrlapjainak megtervezését könnyen elsajátíthatjuk Pap Józsefnek a közelmúltban megjelent, történészek számára íródott gyakorlati kézikönyvéből.)

2. A VBA kód hozzárendelése a gombhoz

A frissen létrehozott gombunkat egyelőre hiába nyomogatjuk, az nem csinál semmit. Ami így természetes, hiszen az Access nem tudja kitalálni helyettünk, hogy mire akarjuk használni azt. Meg kell tehát mondanunk, hogy mi történjen a kattintás után.

Ehhez klikkeljünk jobb egérgombbal az űrlapon elhelyezett gombra, és a menüből válasszuk ki az Eseményszerkesztés… lehetőséget. A megjelenő párbeszédablakban jelöljük ki a Kódszerkesztőt, majd okézzuk le. Ekkor megnyílik a Microsoft Visual Basic for Applications (VBA) kódszerkesztő felülete, ahol a kurzor helyére illesszük be a következő mintára elkészített kódsort: shell "C:\Program Files\R\R-4.2.2\bin\x64\Rscript.exe C:\Munkakonyvtar\sajatKod.R " & Me.beviteliMezoNeve.Value, vbNormalFocus

De mit is látunk itt?

  • Az első elérési útvonal az Rscript.exe programra mutat. Ha esetleg máshová telepítettük az R-t, vagy egy másik verziót használunk, akkor értelemszerűen más lesz az elérési útvonal. Ugyanez igaz az R későbbi frissítése esetén is. Ezt a részt tehát a saját rendszerünkhöz kell igazítani!

  • A második elérési útvonal az R nyelven megírt kódunkra hivatkozik. Arra az algoritmusra, amely tulajdonképpen végrehajtja a feladatot. (Erről lentebb még szó lesz!) Természetesen ez az elérési útvonal is módosítandó a fájl tényleges helyének megfelelően.

  • Az Access űrlapjain minden beviteli mezőnek van egy automatikusan kiosztott saját neve. (Amit egyébként meg is lehet változtatni.) Nekünk arra a konkrét beviteli mezőre kell hivatkoznunk, amely a számunkra szükséges egyedi ID értékét tartalmazza. Egy beviteli mező elnevezését úgy tudjuk megtekinteni, hogy jobb gombbal rákattintunk arra és a felugró menüben a Tulajdonságok lehetőséget választjuk. Az ablak jobb oldalán megjelenő panel Egyéb füle alatt találjuk a beviteli mező nevét. Ezzel kell kicserélni a fentebbi kód megfelelő részét. Ha például Szöveg150 a kérdéses beviteli mező elnevezése, akkor a Me.Szöveg150.Value formában kell hivatkoznunk rá.

A fent megadott kódsor tehát csak egy minta, amit saját magunkra kell szabnunk!

3. Az R nyelven megírt algoritmus

A munka érdemi részét az R nyelven megírt algoritmusunk végzi el. Ahogy azt már fentebb is hangsúlyoztam, a megírandó program teljes mértékben a saját egyedi szempontjainktól függ. Attól, hogy milyen adataink vannak és ezekből mit akarunk kihozni. Ennek a kódblokknak a tartalma tehát mindenkinél más és más lesz.

Én két dolgot tudok itt megmutatni: az Access-ből átküldött ID beolvasását, valamint a végeredményként előállított fájl automatikus elindítását.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Az Access-ből átküldött azonosító elmentése.
ID <- commandArgs(trailingOnly = T)

# ...
# IDE KERÜL A FELADATOT VÉGREHAJTÓ KÓDBLOKK
# ...

# Példa egy legenerált kép megnyitására.
library(xopen)
xopen("C:/Munkakonyvtar/valami.jpg")

Az VBA kód Me.beviteliMezoNeve.Value utasításával beolvasott azonosítót az R szkriptben a commandArgs(trailingOnly = T) függvénnyel szerezhetjük meg. Ezt az iménti kódblokkban az ID nevű változóba mentettem el. Az algoritmusunkban ezen a néven tudunk hivatkozni rá.

A munka végén pedig az xopen csomag teszi lehetővé, hogy a végeredményt magától megnyíljon az adott fájlhoz tartozó alapértelmezett alkalmazással. (Ha van ilyen a gépünkön.) Ezt az első használat előtt telepítsük az install.packages("xopen") utasítással. A működése nagyon egyszerű: paraméterként annak a fájlnak az elérési útját kell megadni, amit szeretnénk megnyitni.

Technikai szempontból tehát mindössze a fenti néhány lépést kell megtenni ahhoz, hogy az Access-ből kiindulva vizualizációkat vagy egyéb tartalmakat állítsunk elő. Majdhogynem tovább tart elolvasni ezt a posztot, mint megcsinálni. 😆 (Kiagyalni persze hosszabb idő volt…)