Cargando, lista, y el uso de R módulos y funciones en PL / R
-
05-10-2019 - |
Pregunta
Tengo dificultades con:
- Listado de los paquetes y funciones disponibles de I a PostgreSQL.
- Instalación de un paquete (como Kendall ) para uso con PL / R
- Llamar a una función de R dentro PostgreSQL
Listing disponibles Paquetes de I
P.1. ¿Cómo se puede averiguar lo que se han cargado los módulos de I?
SELECT * FROM r_typenames();
que muestra los tipos que están disponibles, pero ¿y comprobar si se ha cargado Kendall( X, Y )
? Por ejemplo, el documentación espectáculos:
CREATE TABLE plr_modules (
modseq int4,
modsrc text
);
Esto parece permitir la inserción de registros para dictar que Kendall
se va a cargar, pero el código siguiente no se explican, sintácticamente, la forma de garantizar que se carga:
INSERT INTO plr_modules
VALUES (0, 'pg.test.module.load <-function(msg) {print(msg)}');
P.2. ¿Cómo sería la mirada por encima de la línea como si estuviera tratando de cargar Kendall
?
P.3. ¿Es aplicable?
Instalación de los paquetes de I
Con el administrador "sináptica" paquete han sido instalados los siguientes paquetes:
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
P.4. ¿Cómo sé si Kendall está ahí?
P.5. Si no es así, ¿cómo puedo averiguar qué paquete es en?
Q.6. Si no está en un paquete adecuado para la instalación con apt-get
(aptitude
, synaptic
, dpkg
, lo que tiene), ¿cómo hago para instalarlo en Ubuntu?
P. 7. ¿Dónde están los pasos de instalación documentados?
Llamar R Funciones
Tengo el siguiente código:
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;
Este código llama a la función corr
PostgreSQL para calcular la correlación de Pearson en los datos. Idealmente, me gustaría hacer lo siguiente (cambiando corr
para plr_kendall
):
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;
P.8. ¿Tengo que escribir plr_kendall
mismo?
Q.9 ¿Dónde puedo encontrar un sencilla ejemplo, que camina a través de:.
- Carga de un módulo R en PG.
- Escritura de una envoltura de PG para la función R deseado.
- Llamar a la envoltura PG de un SELECT.
Por ejemplo, serían los dos últimos pasos aspecto:
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
);
Y entonces el SELECT
que el anterior?
Gracias!
Solución
Descripción
listaEstos pasos cómo llamar a una función de R PostgreSQL usando PL / I.
Prerequisties
Usted ya debe tener PostgreSQL, R, e instalado PL / I.
Pasos
- Encuentra R Nombre del módulo (por ejemplo,
Kendall
) - Cambie al usuario de base de datos:
sudo su - postgres
- Ejecutar R
R
- Instalar R Module (aceptar
$HOME/R/x86_64-pc-linux-gnu-library/2.9/
):install.packages("Kendall", dependencies = TRUE)
- Elija un espejo CRAN, cuando se le solicite.
- Cree la siguiente tabla:
CREATE TABLE plr_modules ( modseq int4, modsrc text );
- Insertar en esa mesa de la directiva para cargar el módulo R en cuestión:
INSERT INTO plr_modules VALUES (0, 'library(Kendall)' );
- Reiniciar la base de datos (o
SELECT * FROM reload_plr_modules();
):sudo /etc/init.d/postgresql-8.4 restart
- Crea una función de contenedor en 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;
- Crea una función que utiliza la función de contenedor.
- Prueba la nueva función.
Envoltura Función
Esta función realiza el trabajo de recopilación de datos de la base de datos y la creación de dos matrices. Estas matrices se pasan a la función plr_corr_kendall
envoltura.
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;
prueba
Prueba la función como sigue:
SELECT
*
FROM
climate.analysis_vector();
Resultados
Un número: -0,0578900910913944