当前位置: 首页 > news >正文

R语言中的plumber介绍

R语言中的plumber介绍

  • 基本用法
  • 常用 API 方法
    • 1. GET 方法
    • 2. POST 方法
    • 3. 带路径参数的 GET 方法
  • 使用 R 对数据进行操作
  • 处理 JSON 输入和输出
  • 运行 API 的其他选项
  • 其他功能

plumber 是个强大的 R 包,用于将 R 代码转换为 Web API,通过使用 plumber,可轻松地创建 RESTfulI,以便将 R 的数据处理和分析功能暴露给其他应用程序或用户,plumber是一个非常方便的工具,无论是简单的函数调用还是复杂的数据处理,plumber 都能轻松应对

基本用法

示例

library(plumber)#* @apiTitle 简单 API 示例#* @get /echo
#* @param msg Query parameter
#* @response 200 返回传递的消息
function(msg = "") {list(message = paste("你发送的消息是:", msg))
}

其中#* @标记请求参数格式
可将上面的代码保存在一个名为 api.R 的文件中,然后使用以下代码启动 API:

# 启动 API
library(plumber)
r <- plumb("api.R")  # 载入 API 定义
r$run(port = 8000)    # 启动 API 服务器

然后可通过访问 http://localhost:8000/echo?msg=Hello 来测试 API
在这里插入图片描述
在这里插入图片描述

常用 API 方法

1. GET 方法

#* @get /hello
function() {list(message = "Hello, world!")
}

在这里插入图片描述
在这里插入图片描述

2. POST 方法

#* @post /add
#* @param a:num 第一个数字
#* @param b:num 第二个数字
#* @response 200 返回两个数字的和
function(a, b) {result <- as.numeric(a) + as.numeric(b)list(sum = result)
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以使用 POST 请求将数据发送到 /add,比如通过 curl 或 Postman

3. 带路径参数的 GET 方法

#* @get /square/<num>
#* @param num:num 需要平方的数字
#* @response 200 返回平方值
function(num) {result <- as.numeric(num)^2list(square = result)
}

在这里插入图片描述

访问 http://localhost:8000/square/4 将返回 { “square”: 16 }
在这里插入图片描述

使用 R 对数据进行操作

你可以在 API 中使用 R 的数据操作功能。示例如何计算数据框的统计信息:

#* @get /summary
#* @param dataset:string 数据集名称
#* @response 200 返回数据集的描述性统计
function(dataset) {data(mtcars)  # 加载示例数据集if (dataset == "mtcars") {summary(mtcars)} else {list(error = "数据集不存在")}
}

处理 JSON 输入和输出

例如处理 JSON 输入的示例:

#* @post /mean
#* @param numbers:json 一个数字数组
#* @response 200 返回平均值
function(numbers) {mean_value <- mean(unlist(numbers))list(mean = mean_value)
}
可向 /mean 发送一个 JSON 数组,例如:
{"numbers": [1, 2, 3, 4, 5]
}

运行 API 的其他选项

除了直接在脚本中启动 API,还可以使用 RStudio 或命令行工具将其作为服务运行

library(plumber)
# 创建 API 定义
#* @apiTitle 示例 API
#* @apiVersion 1.0.0#* @get /hello
function() {list(message = "Hello, world!")
}#* @post /multiply
#* @param a:num 第一个数字
#* @param b:num 第二个数字
#* @response 200 返回乘积
function(a, b) {list(product = as.numeric(a) * as.numeric(b))
}
# 启动 API
# r <- plumb("path/to/your/api.R")
# r$run(port = 8000)

在这里插入图片描述

其他功能

  • 身份验证:可以通过添加认证逻辑来保护 API
  • 文档生成:使用注释可以生成 API 文档,便于用户了解如何使用
  • 错误处理:可以自定义错误响应
# 安装和加载 plumber 包
# install.packages("plumber")
library(plumber)# 创建自定义错误处理函数
custom_error_handler <- function(req, res, err) {# 创建一个新的响应对象res$status <- 400  # 自定义状态码res$body <- list(error = "400 - Bad Request",message = err$message)return(res)
}# 定义一个算术加法的 API 路由
# @param a number 被加数
# @param b number 加数
# @post /add
# @error custom_error_handler  # 使用自定义错误处理函数
function(a, b) {# 尝试将参数转换为数值类型a_numeric <- as.numeric(a)b_numeric <- as.numeric(b)# 检查是否成功转换if (is.na(a_numeric) || is.na(b_numeric)) {stop("参数 a 和 b 必须为有效的数值")}# 执行加法result <- a_numeric + b_numericlist(result = result)
}

整理不易 如果觉得有帮助,可以打赏下^ _ ^
在这里插入图片描述

相关文章:

R语言中的plumber介绍

R语言中的plumber介绍 基本用法常用 API 方法1. GET 方法2. POST 方法3. 带路径参数的 GET 方法 使用 R 对数据进行操作处理 JSON 输入和输出运行 API 的其他选项其他功能 plumber 是个强大的 R 包&#xff0c;用于将 R 代码转换为 Web API&#xff0c;通过使用 plumber&#x…...

uniapp 设置 tabbar 的 midButton 按钮

效果展示&#xff1a; 中间的国际化没生效&#xff08;忽略就行&#xff09; 示例代码&#xff1a; 然后在 App.vue 中进行监听&#xff1a; <script>export default {onLaunch(e) {// #ifdef APPuni.onTabBarMidButtonTap(()>{console.log("中间按钮点击回调…...

php 生成随机数

记录:随机数抽奖 要求:每次生成3个 1 - 10 之间可重复(或不可重复)的随机数,10次为一轮,每轮要求数字5出现6次、数字4出现3次、…。 提炼需求: 1,可设置最小数、最大数、每次抽奖生成随机数的个数、是否允许重复 2,可设置每轮指定数字的出现次数 3,可设置每轮的抽奖…...

MySQL 8.4修改初始化后的默认密码

MySQL 8.4修改初始化后的默认密码 &#xff08;1&#xff09;初始化mysql&#xff1a; mysqld --initialize --console &#xff08;2&#xff09;之后,mysql会生成一个默认复杂的密码&#xff0c;如果打算修改这个密码&#xff0c;可以先用旧密码登录&#xff1a; mysql -u…...

前端开发笔记--css 黑马程序员1

文章目录 1. css 语法规范2.css的书写风格3.基础选择器选择器的分类标签选择器类选择器类选择器的特殊使用--多类名 id 选择器 字体属性常见字体字体大小字体粗细字体倾斜字体的复合简写字体属性总结 文本属性文本颜色文本对齐装饰文本文本缩进文本间距文本属性总结 css的引入方…...

ORACLE 19C创建多个不同字符集PDB

现在需要在一个测试环境创建1个为AL32UTF8的PDB,2个ZHS16GBK的PDB 这种情况下,必须先创建的CDB为AL32UTF8,下面是具体步骤: 1.AL32UTF8的pdb在建实例的时候一起创建完成 2.创建第一个ZHS16GBK的PDB cdr,通过pdbseed来克隆: SQL> create pluggable database cdr admin us…...

基于协同过滤的景区旅游可视化与景区推荐系统(自动爬虫,地点可换)

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍过程展示项目移植每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本项目是一个综合性的旅游景区数据管理与分析推荐系统,集成了用…...

ElasticSearch搜索引擎

npm run start ELK&#xff1a; ESLogstashKibana Kibana&#xff1a;端口号5601 elasticSearch是面向文档 Kibana可以将ElasticSearch的数据通过友好的页面展示出来。 Es与Kibana的版本一致 es查询的效率很高&#xff0c;处理大数据 ES和solr的区别&#xff1a; 当单纯的对已有…...

leetcode哈希表(二)-两个数组的交集

题目 . - 力扣&#xff08;LeetCode&#xff09; 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[…...

嵌入式硬件设计中EDA布局与布线实现

大家好,今天主要给大家分享一下,如何使用立创EDA进行布局和布线,具体实现过程如下: 第一:PCB概念介绍 在介绍PCB的时候,先来说明一下,电子管的发明史。 贝尔在1876年发明了电话,爱迪生1879年发明了白炽灯、特斯拉于1888年发明了电动机,所有这些,都为电子学的诞生准…...

entity,pojo,vo,dto 详解

在Java项目中&#xff0c;包名通常用于组织代码&#xff0c;使其更加清晰和易于维护。entity、pojo、vo和dto是常见的包名&#xff0c;它们各自有不同的含义和用途。下面将详细解释这些包名的含义&#xff0c;并提供一个示例&#xff0c;帮助你更好地理解它们在项目中的应用。 …...

C语言常见知识点

目录 一、单位 二、变量 三、常量 四、转义字符 五、操作符 六、指针 七、数组 一、单位 在刚接触编程时&#xff0c;肯定会了解到计算机的存储单位&#xff0c;它们由小到大分别为bit&#xff08;位&#xff09;、Byte&#xff08;字节&#xff09;、KB&#xff08;千字…...

产品设计——应用架构

我的理解应用架构是业务架构的落地&#xff0c;微服务架构下平台的应用架构设计&#xff0c;实质是根据业务来明确应用微服务的边界。因此业务不同&#xff0c;应用架构图也不同。但是基本框架应该相差不大。 其划分原则莫过于高内聚、低耦合。这个跟接口设计是一致的。我们总是…...

Linux初阶——动静态库

一、静态库&#xff08;格式&#xff1a;libxxx.a&#xff09; 1. 原理 在运行之前就已经把函数的实现代码拷进 main.c 文件里了&#xff0c;因此静态库的权限是没有可执行权限的&#xff0c;因为根本不会执行到静态库里的内容。静态库的创建原理本质上就是把所有的函数源文件…...

创建一个c#程序,实现字符串类型转整数类型

首先&#xff0c;创建一个c#程序 在代码编辑器中编写代码&#xff0c;点击Run按钮或者按下F5键来运行程序。 下面&#xff0c;编写将字符串类型转换为整数类型的代码。 sing System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…...

Spring Boot知识管理系统:敏捷开发实践

3系统分析 3.1可行性分析 通过对本知识管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本知识管理系统采用JAVA作为开发语言&#xff0c;Spring Boot框…...

算法竞赛(Python)-AI的思维模式(搜索)

文章目录 一 、深度优先搜索1 零钱搭配2“油漆桶”与连通性 二 、记忆化三、在游戏中制胜的AI1 永远的平局——井字棋2 一起来解谜——数独3 数字华容道 一 、深度优先搜索 深度优先搜索是最基本的搜索方法&#xff0c;在深度优先搜索的过程中&#xff0c;如果把所有的可行解看…...

Android Studio开发Kotlin项目中遇到的问题解决集

背景&#xff1a;Android Studio 2022.3.1 1.Unexpected tokens (use ; to separate expressions on the same line) 无法在同一行声明一个变量并实例化。 解决&#xff1a;分开 &#xff08;1&#xff09; var aaCo:Runoob<String>aaCoRunoob("aa") &…...

【LeetCode】708. 循环有序列表的插入

目录 一、题目二、解法完整代码 一、题目 给定循环单调非递减列表中的一个点&#xff0c;写一个函数向这个列表中插入一个新元素 insertVal &#xff0c;使这个列表仍然是循环非降序的。 给定的可以是这个列表中任意一个顶点的指针&#xff0c;并不一定是这个列表中最小元素的…...

2.1.ReactOS源码分析ReadFile函数分解

2.1.ReactOS源码分析ReadFile函数分解 2.1.ReactOS源码分析ReadFile函数分解 文章目录 2.1.ReactOS源码分析ReadFile函数分解ReadFile函数的分析ReadFile函数的声明ReadFile函数的核心代码 ReadFile函数的分析 BOOL WINAPI ReadFile(HANDLE,PVOID,DWORD,PDWORD,LPOVERLAPPED)…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...