Geladen, die Auflistung, und unter Verwendung von R-Module und Funktionen in PL / R
-
05-10-2019 - |
Frage
Ich habe Schwierigkeiten mit:
- Auflistung der R-Pakete und Funktionen zur Verfügung zu PostgreSQL.
- Installieren eines Pakets (wie Kendall ) zur Verwendung mit PL / R
- Aufruf einer R-Funktion innerhalb von PostgreSQL
Listing Verfügbar R-Pakete
Q.1. Wie Sie heraus finden, was R-Module geladen wurde?
SELECT * FROM r_typenames();
Das zeigt, die Typen, die verfügbar sind, aber was ist die Überprüfung, ob Kendall( X, Y )
geladen wird? Zum Beispiel kann die Dokumentation zeigt:
CREATE TABLE plr_modules (
modseq int4,
modsrc text
);
Das scheint Aufzeichnungen zu ermöglichen Einsetzen dass Kendall
zu diktieren geladen werden, aber der folgende Code nicht erklären, syntaktisch, wie sichergestellt wird, dass es geladen wird:
INSERT INTO plr_modules
VALUES (0, 'pg.test.module.load <-function(msg) {print(msg)}');
Q.2. Was wäre die obige Zeile aussehen, wenn Sie zu laden versuchten Kendall
?
Q.3. Ist es zutreffend?
Installieren R Pakete
Mit dem „synaptischen“ Paket-Manager der folgenden Pakete installiert sind:
r-base
r-base-core
r-base-dev
r-base-html
r-base-latex
r-cran-acepack
r-cran-boot
r-cran-car
r-cran-chron
r-cran-cluster
r-cran-codetools
r-cran-design
r-cran-foreign
r-cran-hmisc
r-cran-kernsmooth
r-cran-lattice
r-cran-matrix
r-cran-mgcv
r-cran-nlme
r-cran-quadprog
r-cran-robustbase
r-cran-rpart
r-cran-survival
r-cran-vr
r-recommended
Q.4. Wie kann ich wissen, ob Kendall da drin ist?
Q.5. Wenn dies nicht der Fall, wie ich heraus finde, was zu verpacken ist es in?
Q.6. Wenn es für die Installation mit apt-get
nicht in einem Paket geeignet ist (aptitude
, synaptic
, dpkg
, was Sie haben), wie gehe ich über die Installation auf Ubuntu?
Q.7. Wenn die Installationsschritte dokumentiert sind?
Aufruf R Funktionen
Ich habe den folgenden Code:
EXECUTE 'SELECT '
'regr_slope( amount, year_taken ),'
'regr_intercept( amount, year_taken ),'
'corr( amount, year_taken ),'
'sum( measurements ) AS total_measurements '
'FROM temp_regression'
INTO STRICT slope, intercept, correlation, total_measurements;
Dieser Code ruft die PostgreSQL-Funktion corr
Pearson-Korrelation über die Daten zu berechnen. Idealerweise möchte ich folgendes tun (von corr
für plr_kendall
Schalt):
EXECUTE 'SELECT '
'regr_slope( amount, year_taken ),'
'regr_intercept( amount, year_taken ),'
'plr_kendall( amount, year_taken ),'
'sum( measurements ) AS total_measurements '
'FROM temp_regression'
INTO STRICT slope, intercept, correlation, total_measurements;
Q.8. Muss ich schreiben plr_kendall
habe mich?
Q.9 Wo ich eine einfach finden Beispiel, das durch geht.
- Laden eines R-Modul in PG.
- Schreiben eines PG-Wrapper für die gewünschte R-Funktion.
- Der Aufruf der PG-Wrapper aus einer SELECT.
Zum Beispiel würde die letzten beiden Schritte wie folgt aussehen:
create or replace function plr_kendall( _float8, _float8 ) returns float as '
agg_kendall(arg1, arg2)
' language 'plr';
CREATE AGGREGATE agg_kendall (
sfunc = plr_array_accum,
basetype = float8, -- ???
stype = _float8, -- ???
finalfunc = plr_kendall
);
Und dann die SELECT
wie oben?
Danke!
Lösung
Übersicht
Diese Schritte Liste, wie eine R-Funktion von PostgreSQL nennen mit PL / R.
Prerequisties
Sie müssen bereits PostgreSQL, R haben, und PL / R installiert ist.
Schritte
- Finden R Modulname (zum Beispiel
Kendall
) - Wechseln Sie in den Datenbankbenutzer:
sudo su - postgres
- Ausführen R
R
- Installieren R-Modul (nehmen
$HOME/R/x86_64-pc-linux-gnu-library/2.9/
):install.packages("Kendall", dependencies = TRUE)
- Wählen Sie ein CRAN Spiegel, wenn Sie dazu aufgefordert.
- Erstellen Sie die folgende Tabelle:
CREATE TABLE plr_modules ( modseq int4, modsrc text );
- Einfügen in diese Tabelle der Richtlinie das R-Modul in Frage zu laden:
INSERT INTO plr_modules VALUES (0, 'library(Kendall)' );
- Starten Sie die Datenbank (oder
SELECT * FROM reload_plr_modules();
):sudo /etc/init.d/postgresql-8.4 restart
- Erstellen Sie eine Wrapper-Funktion in PostgreSQL:
CREATE OR REPLACE FUNCTION climate.plr_corr_kendall( double precision[], double precision[] ) RETURNS double precision AS $BODY$ Kendall(arg1, arg2) $BODY$ LANGUAGE 'plr' VOLATILE STRICT;
- Erstellen Sie eine Funktion, die die Wrapper-Funktion verwendet.
- Testen Sie die neue Funktion.
Wrapper Funktion
Diese Funktion führt die Arbeit von Daten aus der Datenbank zu sammeln und zwei Arrays zu erstellen. Diese Arrays werden in die plr_corr_kendall
Wrapper-Funktion übergeben.
CREATE OR REPLACE FUNCTION climate.analysis_vector()
RETURNS double precision AS
$BODY$
DECLARE
v_year_taken double precision[];
v_amount double precision[];
i RECORD;
BEGIN
FOR i IN (
SELECT
extract(YEAR FROM m.taken) AS year_taken,
avg( m.amount ) AS amount
FROM
climate.city c,
climate.station s,
climate.station_category sc,
climate.measurement m
WHERE
c.id = 5148 AND
earth_distance(
ll_to_earth(c.latitude_decimal,c.longitude_decimal),
ll_to_earth(s.latitude_decimal,s.longitude_decimal)) <= 30 AND
s.elevation BETWEEN 0 AND 3000 AND
s.applicable AND
sc.station_id = s.id AND
sc.category_id = 1 AND
extract(YEAR FROM sc.taken_start) >= 1900 AND
extract(YEAR FROM sc.taken_end) <= 2009 AND
m.station_id = s.id AND
m.taken BETWEEN sc.taken_start AND sc.taken_end AND
m.category_id = sc.category_id
GROUP BY
extract(YEAR FROM m.taken)
ORDER BY
extract(YEAR FROM m.taken)
) LOOP
SELECT array_append( v_year_taken, i.year_taken ) INTO v_year_taken;
SELECT array_append( v_amount, i.amount::double precision ) INTO v_amount;
END LOOP;
RAISE NOTICE '%', v_year_taken;
RAISE NOTICE '%', v_amount;
RETURN climate.plr_corr_kendall( v_year_taken, v_amount );
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
Test
Testen Sie die Funktion wie folgt:
SELECT
*
FROM
climate.analysis_vector();
Ergebnis
Eine Reihe: -0,0578900910913944