plr
从数据库中加载R语言解释器并执行R脚本
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
plr | 8.4.8 | LANG | GPL-2.0 | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 3100 | plr | 否 | 是 | 否 | 是 | 否 | 否 | - |
| 相关扩展 | plpgsql pgml plpython3u pg_tle plv8 pljava plperl pllua |
|---|
missing el10.x86_64
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PGDG | 8.4.8 | 1817161514 | plr | - |
| RPM | PGDG | 8.4.8 | 1817161514 | plr_$v | - |
| DEB | PGDG | 8.4.8 | 1817161514 | postgresql-$v-plr | - |
安装
您可以直接安装 plr 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:
pig repo add pgdg -u # 添加 PGDG 仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install plr; # 当前活跃 PG 版本安装
pig ext install -y plr -v 18 # PG 18
pig ext install -y plr -v 17 # PG 17
pig ext install -y plr -v 16 # PG 16
pig ext install -y plr -v 15 # PG 15
pig ext install -y plr -v 14 # PG 14
dnf install -y plr_18 # PG 18
dnf install -y plr_17 # PG 17
dnf install -y plr_16 # PG 16
dnf install -y plr_15 # PG 15
dnf install -y plr_14 # PG 14
apt install -y postgresql-18-plr # PG 18
apt install -y postgresql-17-plr # PG 17
apt install -y postgresql-16-plr # PG 16
apt install -y postgresql-15-plr # PG 15
apt install -y postgresql-14-plr # PG 14
创建扩展:
CREATE EXTENSION plr;
用法
plr 允许在 PostgreSQL 中使用 R 编程语言编写函数,提供对 R 统计和数据分析功能的完整访问。
CREATE EXTENSION plr;
创建函数
CREATE OR REPLACE FUNCTION r_max(integer, integer) RETURNS integer AS '
if (arg1 > arg2)
return(arg1)
else
return(arg2)
' LANGUAGE plr STRICT;
SELECT r_max(10, 20); -- 20
使用命名参数:
CREATE OR REPLACE FUNCTION sd(vals float8[]) RETURNS float AS '
sd(vals)
' LANGUAGE plr STRICT;
SELECT sd(ARRAY[1.0, 2.0, 3.0, 4.0, 5.0]);
参数处理
- 参数以
arg1、arg2等形式或按命名参数方式访问 - NULL 参数变为 R 的
NA值(除非函数声明为STRICT) - 复合类型(行)以 R data.frame 形式传递
- 数组以 R 向量形式传递
CREATE OR REPLACE FUNCTION r_max(integer, integer) RETURNS integer AS '
if (is.null(arg1) && is.null(arg2))
return(NULL)
if (is.null(arg1))
return(arg2)
if (is.null(arg2))
return(arg1)
if (arg1 > arg2)
return(arg1)
return(arg2)
' LANGUAGE plr;
通过 SPI 访问数据库
CREATE OR REPLACE FUNCTION test_spi(text) RETURNS SETOF record AS '
pg.spi.exec(arg1)
' LANGUAGE plr;
SELECT * FROM test_spi('SELECT oid, typname FROM pg_type LIMIT 5')
AS t(oid oid, typname name);
预备语句:
-- 预备
sp <<- pg.spi.prepare('SELECT * FROM pg_type WHERE typname = $1', c(NAMEOID))
-- 执行
pg.spi.execp(sp, list('text'))
集合返回函数
返回 data.frame 以实现集合返回函数:
CREATE OR REPLACE FUNCTION get_numbers(n int) RETURNS SETOF integer AS '
1:arg1
' LANGUAGE plr;
SELECT * FROM get_numbers(5);
窗口函数
CREATE OR REPLACE FUNCTION r_regr_slope(float8, float8, int)
RETURNS float8 AS '
slope <- NA
y <- farg1
x <- farg2
if (fnumrows == arg3 + 1L)
try(slope <- lm(y ~ x)$coefficients[2])
return(slope)
' LANGUAGE plr WINDOW;
窗口函数接收 farg1..fargN(窗口帧内的值向量)、fnumrows(帧大小)和 prownum(分区中的当前行位置)。
全局变量
使用 R 的全局环境在函数调用之间保持数据:
CREATE OR REPLACE FUNCTION set_state(key text, val text) RETURNS void AS '
assign(arg1, arg2, env=.GlobalEnv)
' LANGUAGE plr;
实用辅助函数
SELECT load_r_typenames(); -- 加载类型 OID 变量
SELECT * FROM r_typenames(); -- 列出可用的类型 OID
SELECT plr_version(); -- PL/R 版本
触发器函数
PL/R 支持触发器函数,可以访问 pg.tg.name、pg.tg.relname、pg.tg.when、pg.tg.level、pg.tg.op、pg.tg.new 和 pg.tg.old。