Geladen, die Auflistung, und unter Verwendung von R-Module und Funktionen in PL / R

StackOverflow https://stackoverflow.com/questions/2932028

  •  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.

  1. Laden eines R-Modul in PG.
  2. Schreiben eines PG-Wrapper für die gewünschte R-Funktion.
  3. 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!

War es hilfreich?

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

  1. Finden R Modulname (zum Beispiel Kendall)
  2. Wechseln Sie in den Datenbankbenutzer:
    sudo su - postgres
  3. Ausführen R
    R
  4. Installieren R-Modul (nehmen $HOME/R/x86_64-pc-linux-gnu-library/2.9/):
    install.packages("Kendall", dependencies = TRUE)
  5. Wählen Sie ein CRAN Spiegel, wenn Sie dazu aufgefordert.
  6. Erstellen Sie die folgende Tabelle:
    CREATE TABLE plr_modules (
    modseq int4,
    modsrc text
    );
  7. Einfügen in diese Tabelle der Richtlinie das R-Modul in Frage zu laden:
    INSERT INTO plr_modules
    VALUES (0, 'library(Kendall)' );
  8. Starten Sie die Datenbank (oder SELECT * FROM reload_plr_modules();):
    sudo /etc/init.d/postgresql-8.4 restart
  9. 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;
  10. Erstellen Sie eine Funktion, die die Wrapper-Funktion verwendet.
  11. 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top