代码之家  ›  专栏  ›  技术社区  ›  Dave Jarvis James Eichele

在pl/r中加载、列出和使用r模块和函数

  •  2
  • Dave Jarvis James Eichele  · 技术社区  · 14 年前

    我在以下方面遇到困难:

    • 列出PostgreSQL可用的R包和函数。
    • 安装程序包(例如 Kendall )用于PL/R
    • 在PostgreSQL中调用r函数

    列出可用的R包

    Q. 您如何确定已加载了哪些R模块?

    SELECT * FROM r_typenames();
    

    它显示了可用的类型,但是检查 Kendall( X, Y ) 载入了吗?例如, documentation 显示:

    CREATE TABLE plr_modules (
      modseq int4,
      modsrc text
    );
    

    这似乎允许插入记录来指示 Kendall 将被加载,但以下代码没有从语法上解释如何确保加载:

    INSERT INTO plr_modules
      VALUES (0, 'pg.test.module.load <-function(msg) {print(msg)}');
    

    Q. 2. 如果您试图加载,上面的行会是什么样子 肯德尔 ?
    Q.3. 是否适用?

    安装R包

    使用“synaptic”软件包管理器安装了以下软件包:

    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. 我怎么知道肯德尔在里面?
    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 计算皮尔逊与数据的相关性。理想情况下,我想做以下工作(通过切换 科尔 对于 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;
    

    Q.8。 我要写吗 普里恩肯德尔 我自己?
    Q.9。 在哪能找到 简单的 示例:

    1. 将R模块加载到pg.
    2. 为所需的r函数编写pg包装器。
    3. 从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
    );
    

    然后 SELECT 如上?

    谢谢您!

    1 回复  |  直到 14 年前
        1
  •  6
  •   Dave Jarvis James Eichele    14 年前

    概述

    这些步骤列出了如何使用pl/r从PostgreSQL调用r函数。

    先决条件

    您必须已经安装了PostgreSQL、R和PL/R。

    步骤

    1. 查找R模块名称(例如, Kendall )
    2. 更改为数据库用户:
      sudo su - postgres
    3. 运行R
      R
    4. 安装R模块(接受 $HOME/R/x86_64-pc-linux-gnu-library/2.9/ ):
      install.packages("Kendall", dependencies = TRUE)
    5. 当提示时,选择起重机后视镜。
    6. 创建下表:
      CREATE TABLE plr_modules (
      modseq int4,
      modsrc text
      );
    7. 在该表中插入加载相关R模块的指令:
      INSERT INTO plr_modules
      VALUES (0, 'library(Kendall)' );
    8. 重新启动数据库(或 SELECT * FROM reload_plr_modules(); ):
      sudo /etc/init.d/postgresql-8.4 restart
    9. 在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. 创建使用包装函数的函数。
    11. 测试新功能。

    包装器函数

    此函数执行从数据库收集数据和创建两个数组的工作。这些数组被传递到 plr_corr_kendall 包装函数。

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

    结果

    编号:0.0578900910913944