百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

在 R 中运行 Python 脚本(r如何运行代码)

off999 2024-10-21 07:00 24 浏览 0 评论

以下是如何构建一个简单的包装函数以在 R 中执行 Python 脚本

复杂的统计分析通常需要使用不同编程语言的脚本。 例如,您可能想在 Python 中开发和训练机器学习模型并处理您的数据,但在 R 中运行统计分析。有时,通过 R 中的一个包装函数来执行所有脚本会更容易。在这篇文章中,我将展示 编写一个简单的包装函数的步骤,该函数采用 R 或 Python 脚本的完整路径,执行它,并写入进程中的日志。


设置日志文件

首先,当您执行多个脚本时,您需要保留一个日志文件来跟踪哪些脚本已执行,以及已生成哪些文件和/或图形。 使用以下代码在 R 中轻松设置日志文件。

logfile_name <- gsub('-| |:','_',paste('logfile_',Sys.time(),'.log',sep=''))
log_file <- file(logfile_name)


我总是喜欢使用 Sys.time() 在文件名中包含复制的开始时间(以防万一您想运行多个迭代进行比较)。 gsub 可用于从文件名中删除任何空格和其他不寻常的字符,用下划线替换它们。

通过“打开”日志文件(即建立连接)并使用 cat() 命令添加日志条目,将新消息附加到日志文件中。 使用 paste() 将存储在对象中的信息与其他字符串组合起来(在此示例中,我包含了正在执行的脚本的名称,存储在名为 script_name 的变量中)。 最后,确保在记录日志消息后立即再次关闭日志文件。

log_file <- file(logfile_name, open = 'a')
cat(
	paste(
		'\n\nExecuting ',
		script_name,
		' script (start time: ',
		Sys.time(),')',
		sep=''
		), 
	file = log_file, 
	append = TRUE
	)
close(log_file)


在 R 中执行 Python 脚本

要执行保存在 R 工作目录中的 R 文件,只需调用 source(script_name.R)。在 R 中执行 Python 脚本需要更多步骤。使用输入参数执行 Python 脚本的代码如下所示。

system(paste('python3', script_name, input_params, sep=' '))


让我们一步一步地看一下这段代码。首先,您需要像在终端(在 Mac OS 上)或命令提示符(在 Windows 上)中使用的那样传入 Python 代码,例如python3 myscript.py。但是,您通常会希望包含一些在 Python 代码中使用的输入参数。为此,您可以将输入参数分配给 R 中的一个对象(在此示例中,此对象称为 input_params)。这是什么类型的对象取决于您创建的 Python 函数。例如,它可以是单个值(例如整数或浮点数)或不同类型的不同值的列表。

第二步,您需要对 Python 脚本进行一些更改,以确保您的程序可以实际使用这些参数:sys.argv[index]。这在下面的示例中进行了说明。

import sys
x = float(sys.argv[1])
print(x + 5)

在此示例中,假设我们的脚本名为 add_five.py。 还假设,无论出于何种原因,我们想从 R 中运行这个 Python 代码并将其应用于浮点值 3.0。 这可以通过使用 R 中的 system() 命令结合您的输入数据和以下代码中的 python 脚本来实现:system(paste('python3 add_five.py 3.0')。

sys.argval 允许您从命令中获取输入。 由于 Pyton 按从零开始的整数索引列表,脚本名称可以通过 sys.argv[0] 访问,而浮点值 3.0 可以通过添加参数 sys.argv[1] 包含在 Python 中的计算中使用。 请注意,此参数将作为字符串值在您的命令中读取,因此您必须将其转换为适合您的代码的类型(此处为浮点值)。


把它们放在一起

综上所述,我们有一个简单的包装函数,它从 R 中执行文件,获取日志文件、打印消息、脚本名称、一些输入参数和编程语言(“R”或“Python”)。 完整代码如下所示。

library(types)
library(testit)
logfile_name <- gsub('-| |:','_',paste('logfile_',Sys.time(),'.log',sep=''))
log_file <- file(logfile_name)

execute_script <- function(script_name = ? character,type="R" ? character,input_params=NULL){
  assert("Supported language", type %in% c("R", "Python"))
  log_file <- file(logfile_name, open = 'a')
  cat(paste('\n\nExecuting ',script_name,' script (start time: ',Sys.time(),')',sep=''), file = log_file,append = TRUE)
  close(log_file)
  
  
  if(type=="R"){
    execution_time <- round(system.time({source(script_name)})[3]/60,digits=2)
  }else{
    execution_time <- round(system.time({system(paste('python3',script_name, input_params, sep=' '))})[3]/60,digits=2)  
  }
  
  log_file <- file(logfile_name, open = 'a')
  cat(paste('\n',script_name, ' script run. Execution time: ', execution_time," minutes",sep=''), file = log_file,append = TRUE)
  close(log_file)
  
  message(paste('\n',script_name, ' script run. Execution time: ', execution_time," minutes",sep=''))
  
}

上面显示的函数允许用户执行 R 和 Python 文件,并在脚本执行完成后注册一个简单的日志消息。 您现在可以直接在 R 中使用 execute_script(“myscript.py”, “Python”, 3.0),而不是使用 source()。

当您需要为结合 Python 和 R 的分析执行许多不同的脚本时,使用包装函数是创建简洁复制工作流的更简单方法。


谢谢阅读!

相关推荐

Linux 网络协议栈_linux网络协议栈

前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...

揭秘 BPF map 前生今世_bpfdm

1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...

教你简单 提取fmpeg 视频,音频,字幕 方法

ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...

Linux内核原理到代码详解《内核视频教程》

Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...

Linux C Socket UDP编程详解及实例分享

1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...

libevent源码分析之bufferevent使用详解

libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...

一次解决Linux内核内存泄漏实战全过程

什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...

linux网络编程常见API详解_linux网络编程视频教程

Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...

Linux下C++访问web—使用libcurl库调用http接口发送解析json数据

一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...

平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道

在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...

谈谈分布式文件系统下的本地缓存_什么是分布式文件存储

在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...

进程间通信之信号量semaphore--linux内核剖析

什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...

30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南

30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...

取消回复欢迎 发表评论: