Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在PL/R中加载、列出和使用R模块和函数_Postgresql_R_Plr - Fatal编程技术网

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函数
列出可用的R包 Q.1.您如何找到已加载的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.我在哪里可以找到一个简单的例子:

  • 将R模块加载到PG中
  • 为所需的R函数编写PG包装器
  • 从SELECT调用PG包装器
  • 例如,最后两个步骤看起来像:

    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();