Postgresql 在PL/R中加载、列出和使用R模块和函数
我在以下方面有困难:Postgresql 在PL/R中加载、列出和使用R模块和函数,postgresql,r,plr,Postgresql,R,Plr,我在以下方面有困难: 列出PostgreSQL可用的R包和函数 安装用于PL/R的包(例如) 在PostgreSQL中调用R函数 列出可用的R包 Q.1.您如何找到已加载的R模块 SELECT * FROM r_typenames(); 这显示了可用的类型,但是检查是否加载了Kendall(X,Y)呢?例如,以下示例显示: 这似乎允许插入记录来指示加载Kendall,但以下代码没有从语法上解释如何确保加载: INSERT INTO plr_modules VALUES (0, 'pg.
- 列出PostgreSQL可用的R包和函数
- 安装用于PL/R的包(例如)
- 在PostgreSQL中调用R函数
SELECT * FROM r_typenames();
这显示了可用的类型,但是检查是否加载了Kendall(X,Y)
呢?例如,以下示例显示:
这似乎允许插入记录来指示加载Kendall
,但以下代码没有从语法上解释如何确保加载:
INSERT INTO plr_modules
VALUES (0, 'pg.test.module.load <-function(msg) {print(msg)}');
问题4.我怎么知道肯德尔是否在那里?Q.5.如果不是,我如何找出它在哪个包中?
Q.6.如果它不在适合使用
apt get
安装的软件包中(aptitude
,synaptic
,dpkg
,你有什么),我该如何在Ubuntu上安装它?Q.7.安装步骤记录在哪里?
调用R函数 我有以下代码:
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;
此代码调用PostgreSQL函数corr
,以计算Pearson对数据的相关性。理想情况下,我希望执行以下操作(通过为plr\u kendall
切换corr
):
Q.8.我必须自己写plr\u kendall
Q.9.我在哪里可以找到一个简单的例子:
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
);
然后按上述方法选择
谢谢大家! 概述
这些步骤列出了如何使用PL/R从PostgreSQL调用R函数
先决条件
您必须已经安装了PostgreSQL、R和PL/R
台阶
查找R模块名称(例如,Kendall
)
更改为数据库用户:
出现提示时,选择一个CRAN镜像
创建下表:
在PostgreSQL中创建包装函数:
试验
按以下步骤测试功能:
SELECT
*
FROM
climate.analysis_vector();
结果
编号:-0.0578900910913944
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;
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
);
sudo su - postgres
R
install.packages("Kendall", dependencies = TRUE)
CREATE TABLE plr_modules (
modseq int4,
modsrc text
);
INSERT INTO plr_modules
VALUES (0, 'library(Kendall)' );
sudo /etc/init.d/postgresql-8.4 restart
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;
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;
SELECT
*
FROM
climate.analysis_vector();