R包开发-2.1:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)
目录
0-前言
1-在RStudio中创建R包项目
2-创建R包
2.1通过R函数创建新包
2.2在RStudio通过菜单来创建一个新包
2.3关于R包创建的说明
3-添加R自定义函数
4-添加C++函数
0-前言
目标:在RStudio中创建一个R包,这个R包中包含C++函数,接口是Rcpp。
为了实现这个目标,我们复现一个简单的R包Rcpp2doParallel,取名ReproduceRcpp2doParallel.
这个R包的相关内容:
From: rdrr.io(可以查看这个R包中R文件)
From: GitHub (包括创建这个R包的所有文件)
注:如果想看一个R包的源码状态
- 如果这个包发表在GitHub,在GitHub上搜索这个包的名字,可以找到这个R包的源码状态,尤其是当这个包还使用了C++函数的时候,可以在源码包中找到src/目录里的cpp文件;
- 如果这个包发表在CRAN,在GitHub上可以找到CRAN,在CRAN里检索包的名字,或者直接在GitHub上检索包的名字,尤其是当这个包还使用了C++函数的时候,可以在源码包中找到src/目录里的cpp文件;
- rdrr.io这个网站只能看包里的R函数,如果这个包还使用了C++函数,在这个网站上是看不到这个包里的C++函数。
1-在RStudio中创建R包项目
建立与GitHub有连接的R包项目,具体参考R包开发一:R与Git版本控制
此时,我们得到名为ReproduceRcpp2doParallel的文件夹,如下图所示:
2-创建R包
创建R包有两种形式:
- 通过R函数create_package来创建新包 ;(本文使用的是该种方法创建新包)
- 在RStudio通过菜单来创建一个新包。(本文此处仅展示如何通过这种方式创建)
2.1通过R函数创建新包
键入创建R包的语句,第二行语句表示在当前路径下创建一个新包,创建R包函数为create_package():
library(devtools)
create_package(getwd())
得到如下结果:
> library(devtools) 载入需要的程辑包:usethis > create_package(getwd()) ✔ Setting active project to 'D:/桌面/ReproduceRcpp2doParallel' ✔ Creating 'R/' ✔ Writing 'DESCRIPTION' Package: ReproduceRcpp2doParallel Title: What the Package Does (One Line, Title Case) Version: 0.0.0.9000 Authors@R (parsed):* First Last <first.last@example.com> [aut, cre] (YOUR-ORCID-ID) Description: What the package does (one paragraph). License: `use_mit_license()`, `use_gpl3_license()` or friends topick a license Encoding: UTF-8 Roxygen: list(markdown = TRUE) RoxygenNote: 7.2.3 ✔ Writing 'NAMESPACE' Overwrite pre-existing file 'ReproduceRcpp2doParallel.Rproj'?1: No 2: Yeah 3: Not nowSelection: 2 ✔ Writing 'ReproduceRcpp2doParallel.Rproj' ✔ Adding '^ReproduceRcpp2doParallel\\.Rproj$' to '.Rbuildignore' ✔ Adding '^\\.Rproj\\.user$' to '.Rbuildignore' ✔ Opening 'D:/桌面/ReproduceRcpp2doParallel/' in new RStudio session ✔ Setting active project to '<no active project>'
注意,“√”表示这个语句完成了哪些具体的工作,"●"表示需要我们手动操作的内容。(当然,上述创建R包的语句中没有●);
上述代码中问道:是否重写ReproduceRcpp2doParallel.Rproj?选择yeah,即重写这个项目文件,对原来的项目文件进行覆盖。注意:这里每次的选项顺序不一样,要根据意思进行选择,而不是根据编号进行选择!
2.2在RStudio通过菜单来创建一个新包
直接在RStudio中建立新项目New Project. 其操作为New Project --> New Directory --> R package --> print R package name --> create Project.
![](https://img-blog.csdnimg.cn/4e8721ade88d4a2d80ab313da2d7b478.png)
2.3关于R包创建的说明
不管是使用RStudio的菜单栏还是使用R函数,得到的结果都是一样的:一个最小的可用包,它由以下三个部分组成:
- 一个R/目录;
- 一个描述文件DESCRIPTION;
- 一个命名空间文件NAMSESPACE。
这个包还包括一个RStudio项目文件ReproduceRcpp2doParallel.Rproj,这将使你的包易于在RStudio中使用。
一些解释性的内容,其中:
- DESCRIPTION文件:描述了你的包需要依赖什么来工作,如果要分享你的包,也会用DESCRIPTION文件来描述它的功能,谁可以使用它(许可证),以及如果包出现了问题该和谁联系。是关于R包的元数据。
- NAMESPACE命名空间文件:为了和其他的包很好地协作,你的包需要定义它可以输出什么函数供其他包使用,以及它需要使用其他包的什么函数,这是NAMESPACE文件的工作,通过roxygen2来生成它。(roxygen最初从2008年的Google编程夏令营中诞生,作用是用来写帮助文档,可以在一个R文件中上面部分敲文档,下面部分敲代码,不需要在两个文件中切来切去,这让码农从重复劳动和技术细节中解放出来专心写代码。)
- R/目录:里面存放构成这个包的R文件,实际上R包就是将一堆R自定义函数打包在一起,所以R/目录这个文件夹中存放的是一堆R自定义函数,一个自定义函数一个R文件。
- .gitignore和.Rbuildignore:包含Git或者R包构建时应该忽略的文件。
至此,初步的开发R包的框架已经搭建完成,并且已经与远程仓库(Github)建立连接,后续任何更新都可以很容易地提交到Github仓库(提交步骤:Staged --> Commit --> Push)。
3-添加R自定义函数
此时R/目录文件夹是空的,需要我们在里面添加一些自定义函数。
use_r("mean_parallel_compute")
由于这里是复现Rcpp2doParallel包,所以ReproduceRcpp2doParallel这个包里的所有函数,都来自于Rcpp2doParallel.
通过rdrr.io 或者GitHub 可以找到Rcpp2doParallel包自定义R函数,如mean_parallel_compute.R,函数如下:
#' Call an Rcpp function within a doParallel call
#'
#' Constructs an example showing how to use `foreach`, `iterators`, and
#' `doParallel` to perform a parallel computation with a C++ function written
#' using Rcpp.
#'
#' @param n Number of Observations
#' @param mean Center of Normal Distribution
#' @param sd Standard Deviation of Normal Distribution
#' @param n_sim Number of Simulations to Run
#' @param n_cores Number of CPU cores to use in parallelization task.
#'
#' @return
#' A `vector` of length `n_sim` containing the mean for each distribution.
#'
#' @export
#'
#' @importFrom foreach %dopar% foreach
#' @importFrom iterators icount
#' @importFrom doParallel registerDoParallel
#' @importFrom stats rnorm
#'
#' @details
#' The `mean_parallel_compute()` function performs a bootstrap computation in
#' parallel of a mean value from the normal distribution.
#'
#' @examples
#' # Compute the mean on 1000 observations with 50 replications across
#' # 2 CPUs.
#' mean_parallel_compute(1000, n_sim = 50, n_cores = 2)
mean_parallel_compute = function(n, mean = 0, sd = 1,n_sim = 1000,n_cores = parallel::detectCores()) {# Construct clustercl = parallel::makeCluster(n_cores)# After the function is run, close the cluster.on.exit(parallel::stopCluster(cl))# Register parallel backenddoParallel::registerDoParallel(cl)# Compute estimatesestimates = foreach::foreach(i = iterators::icount(n_sim), # Perform n simulations.combine = "rbind", # Combine results# Self-load.packages = "Rcpp2doParallel") %dopar% {random_data = rnorm(n, mean, sd)result = mean_rcpp(random_data) # or use Rcpp2doParallel::mean_rcpp()result}estimates
}
可以看到这个R文件分成上下两个部分,上面是关于文档说明的部分,之后会来制作帮助页面,下面部分是代码部分。通常,首先我们在通过use_r("R文件名字")中敲完代码,之后将鼠标放在函数体内,在RStudio中找到code--> Insert Roxygen Skeleton,便自动插入函数注释信息模板。(注意,一定要把光标放在函数体内,否则会弹出报错提示信息,告知要把光标放在函数体内。)
第一步:我们只粘贴上面的代码部分
第二步:函数的注释部分通过code-->Insert Roxygen Skeleton来填充。得到下图,接着对照Rcpp2doParallel包中mean_parallel_compute自定义R函数文件,将其注释信息补充到我们当前打开的R文件中。
自动插入的函数注释信息为:@param、@return、@export、@ examples,其中@param后的参数是自动识别的,剩下的内容需要自己手动补充,就好像是按照要求填写表格。子弟哦那个插入函数的注释信息只出现在该R文件的函数上面,不会变动函数部分,换句话说,这样R文件被分成了两部分,上部分是函数注释信息,下部分是自定义R函数。其中函数注释信息,每行注释都以 #' 开头,@引导的关键词包括标题、描述、参数、返回值、工作示例,我们在这些关键词后面分别填写相应的内容。
@export表示导出该函数,这样做文档化时,会自动将这个函数添加到NAMESPACE文件。导出函数后,安装该包可以使用该函数,如果不添加@export,则不导出函数,这样的函数叫作内部函数,只供包里的其他函数使用。
有了上述帮助信息,就可以执行文档化,代码如下,这样将自动生成函数帮助,实际上是调用roxygen2包生成man/function_name.Rd,该文件在RStudio Help窗口显示就如同我们平时使用“?函数名”查看帮助文件所看到的一样。
@importFrom package_name function 表示从什么包 导入 哪个函数,也就是说,我们下面的这个自定义函数,用到了哪些包中的哪个函数,这个需要一一的通过@importFrom列出来。
@importFrom stats rnorm:从stats包导入函数rnorm函数。
@importFrom foreach %dopar% foreach:从foreach包导入两个函数:%dopar%和foreach(是函数)。
当包打包完成并在本地RStudio中加载过后,通过?mean_parallel_compute,得到下面的效果。
(不知道是不是文章太长了,导致保存的时候,经常会出现问题,接下来的内容以及参考放在新的文章中。)
相关文章:
![](https://img-blog.csdnimg.cn/3345c1523495425581c8fc3e35cbee6d.png)
R包开发-2.1:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)
目录 0-前言 1-在RStudio中创建R包项目 2-创建R包 2.1通过R函数创建新包 2.2在RStudio通过菜单来创建一个新包 2.3关于R包创建的说明 3-添加R自定义函数 4-添加C函数 0-前言 目标:在RStudio中创建一个R包,这个R包中包含C函数,接口是Rc…...
![](https://img-blog.csdnimg.cn/dce300d222714d018d76dc39090949dd.png)
土豆叶病害识别(图像连续识别和视频识别)
效果视频:土豆叶病害识别(Python代码,pyTorch框架,视频识别)_哔哩哔哩_bilibili 代码运行要求:Torch库>1.13.1,其它库无版本要求 1..土豆叶数据集主要包好三种类别(Early_Blight…...
![](https://img-blog.csdnimg.cn/2f3d6a2929c245c3ba7d9af46d457fb3.png)
三、JVM监控及诊断工具-GUI篇
目录 一、工具概述二、jconsole(了解即可)1、基本概述2、启动3、三种连接方式4、作用 三、Visual VM 一、工具概述 二、jconsole(了解即可) 1、基本概述 从Java5开始,在JDK中自带的Java监控和管理控制台用于对JVM中内…...
![](https://www.ngui.cc/images/no-images.jpg)
3211064 - 错误消息 AA634 出现在 T-cd AW01N 或 T-cd AFAR 中
症状 通过 T-cd AW01N 打开资产或在 T-cd AFAR 中重新计算资产值时,出现以下错误消息: AA634 在范围 01 中普通折旧的更正大于累计折旧 环境 SAP R/3SAP R/3 EnterpriseSAP ERP SAP ERP 中心组件SAP ERP 的 SAP 增强包SAP ERP(SAP HANA 版…...
![](https://img-blog.csdnimg.cn/3e6e8591c98b49f8b3f029fe4d8c6200.png)
k3s or RKE2 helm安装报错dial tcp 127.0.0.1:8080: connect: connection refused
1.报错: Error: INSTALLATION FAILED: Kubernetes cluster unreachable: Get "http://127.0.0.1:8080/version": dial tcp 127.0.0.1:8080: connect: connection refused 2.问题原因: 1.因为helm默认使用k8s的配置文件,默…...
![](https://www.ngui.cc/images/no-images.jpg)
网络安全应急响应预案演练
制定好的应急响应预案,只做培训还不够,还需要通过实战演 练来提高应对网络突发事件的行动力,针对网络突发事件的假想情 景,按照应急响应预案中规定的职责和程序来执行应急响应任务。 根据出现的新的网络攻击手段或其他特殊情况…...
![](https://img-blog.csdnimg.cn/d9eb7f5e35ba46ce934a4d6fb94d4b25.png)
Redis 的混合持久化
RDB 相比于 AOF,数据恢复的速度更快,因为是二进制数据,直接加载进内存即可,但是 RDB 的频率不好把握。 如果频率太低,在两次快照期间服务器发生宕机,可能会丢失较多的数据如果频率太高,频繁写入…...
![](https://img-blog.csdnimg.cn/eb5a18d633604e008089068b7b310f10.png)
ElasticSearch总结
ES是什么 ES是一个天生支持分布式的搜索、聚合分析的存储引擎 基于Java开发 基于Lucene的开源分布式搜索引擎 ELK : elasticSearch Logstah Kibana 加入 Beats 后 ELK 改为 :Elastic stack ES解决了什么问题 ES解决的核心问题 : 1.海量数…...
![](https://img-blog.csdnimg.cn/img_convert/14824e3f3dd6b4309716ea1e9a16199e.png)
手写数字识别之损失函数
目录 交叉熵 手写数字识别之损失函数 分类任务的损失函数 Softmax函数 交叉熵的简单理解:真实分布与非真实分布的交叉,完全对应,熵为0 交叉熵的代码实现 交叉熵 给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普…...
![](https://www.ngui.cc/images/no-images.jpg)
sleep () 和 wait () 有什么区别?
在Java中,sleep() 和 wait() 是两个用于处理多线程的方法,它们具有不同的作用和用途。 sleep(): sleep() 是 Thread 类的一个静态方法,用于暂停当前线程的执行一段指定的时间。它会阻塞当前线程,不会让其他线程获得执…...
![](https://www.ngui.cc/images/no-images.jpg)
第一百二十七回 空安全
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了级联操作符相关的内容,本章回中将介绍 空安全.闲话休提,让我们一起Talk Flutter吧。 概念介绍 在编译语言中都有空指针或者空对象(null),它们会引起程序的异常。在移动开发中如果…...
![](https://img-blog.csdnimg.cn/cf4ead2c65bb4894b3910b93efae6cf0.png)
js判断类型:typeof Object.prototype.toString instanceof constructor有什么区别?一文讲清楚
相信很多小伙伴在使用js的过程中,经常会需要对js的数据类型进行判断,而js中可以对数据类型进行判断的方法有很多种,最常见的有typeof、Object.prototype.toString、instanceof、constructor这四种,那么他们有什么区别呢࿱…...
![](https://img-blog.csdnimg.cn/8127e2ae84fe45ac8ca9d3084637d18e.png)
uview ui 1.x ActonSheet项太多,设置滚动
问题:ActionSheet滚动不了。 使用uview ui :u-action-sheet, 但是item太多,超出屏幕了, 查了一下文档,并没有设置滚动的地方。 官方文档:ActionSheet 操作菜单 | uView - 多平台快速开发的UI框架 - uni-a…...
![](https://img-blog.csdnimg.cn/f8278399c71443d68794ef3dc6b7e349.png)
信息化发展2
信息系统生命周期 1 、软件的生命周期通常包括:可行性分析与项目开发计划、需求分析、概要设计、详细设计、编码、测试、维护等阶段。 2 、信息系统的生命周期可以简化为:系统规划(可行性分析与项目开发计划),系统分析…...
![](https://www.ngui.cc/images/no-images.jpg)
ubuntu18 + ros2 eloquent +python3.6
卸载 sudo systemctl stop ros2-eloquent-* #输入以下命令以停止所有ROS 2 Eloquent相关的进程 sudo apt remove ros-eloquent-* #输入以下命令以卸载ROS 2 Eloquent软件包 ls /etc/ros/ ls /opt/ros/ sudo rm -rf /opt/ros/eloquent#输入以下命令以删除ROS 2 Eloquent的配置文…...
![](https://img-blog.csdnimg.cn/179cd142ab4140b7a8016e1334a2e22c.png)
围棋与育种
最近因为娃子报名了围棋课,我本着交一次课学两个人的态度,入门围棋,买了些书,听了些课,有所得。学了两个多月,现在6级水平,了解了基本的攻杀技巧,会判断输赢。 下面截图是今天的一盘…...
![](https://img-blog.csdnimg.cn/img_convert/234b82ee0fad1eb213bcd64eda380ee3.png)
Python第三方库纵览
Python第三方库纵览 知识点 更广泛的Python计算生态,只要求了解第三方库的名称,不限于以下领域: 网络爬虫、数据分析、文本处理、数据可视化、用户图形界面、机器学习、Web开发、游戏开发等 知识导图 1、网络爬虫方向 网络爬虫是自动进行HTTP访问并捕…...
![](https://img-blog.csdnimg.cn/109c9f7d3afb44e797c9d9322c60a6f6.png)
测试.net开源音频库NAudio
微信公众号“dotNET跨平台”看到一篇文章《【.NET】使用NAudio实现录音功能》介绍基于NAudio实现录音功能(参考文献1)。NAudio是开源.net音频库,其支持播放多种格式的音频(WAV、AIFF、MP3、WMA等)、音频格式转换、录音…...
![](https://img-blog.csdnimg.cn/img_convert/0b846fcdebcaee068357a64b43136382.webp?x-oss-process=image/format,png)
三方接口调用设计方案
在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,数据是否可以重复提交等问题 在设计三方接口调用的方案时,需要考虑到安全性和可用性。以下是一种设计方案的概述&a…...
![](https://img-blog.csdnimg.cn/img_convert/0107e07a2c0e92feb66fa910c56075fa.jpeg)
OLED透明屏全贴合技术:未来显示技术的突破性创新
在现代科技发展的浪潮中,OLED透明屏全贴合技术以其独特的优势和无限的应用前景引起了广泛的关注。 在这篇文章中,尼伽将深入探索OLED透明屏全贴合技术,介绍其优势和特点,并展望其在不同领域的应用前景。 一、OLED透明屏全贴合技术…...
![](https://img-blog.csdnimg.cn/0a364c09d1d6450f9889d190e0747796.png#pic_center)
map、sync.map、concurrent-map适用场景与源码解析
最近一直加班,无论工作日还是周末,虽然每天很忙但总感觉空空的,很少有时间停下来思考与总结。项目中各种甩锅,最后最苦逼的还是落到了研发的头上,文档编写、环境部署、问题排查虐得一遍又一遍。事情杂乱,研…...
![](https://www.ngui.cc/images/no-images.jpg)
分布式事物实现方案及优缺点
实现分布式事务是一个复杂的任务,涉及到许多技术和概念。在Java开发中,你可以借助一些框架和工具来实现分布式事务,以下是一些常见的方法: 1.两阶段提交(2PC) 这是一种经典的分布式事务处理方法。它涉及到…...
![](https://www.ngui.cc/images/no-images.jpg)
java使用@interface和反射来动态生成excel
1、对象类上搞注解 public class ReportExecuteDetailDto { // 项目信息 private String regionCode; // 大区编号 ExcelColumn(order 0, title "大区") private String regionName; // 大区名称 ExcelColumn(order 14, tit…...
![](https://img-blog.csdnimg.cn/4f888dc8ca004f8a9c8650b6a020691b.png)
【微服务】04-Polly实现失败重试和限流熔断
文章目录 1. Polly实现失败重试1.1 Polly组件包1.2 Polly的能力1.3 Polly使用步骤1.4 适合失败重试的场景1.5 最佳实践 2.Polly实现熔断限流避免雪崩效应2.1 策略类型2.2 组合策略 1. Polly实现失败重试 1.1 Polly组件包 PollyPolly.Extensions.HttpMicrosoft.Extensions.Htt…...
![](https://img-blog.csdnimg.cn/49003d19702f43c9a233b53cf361faf0.png)
如何使用HTML5新增的标签来构建语义化的页面结构?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ <header>:⭐ <nav>:⭐ <main>:⭐ <section>:⭐ <article>:⭐ <aside>:⭐ <footer>:⭐ <figure> 和 &l…...
![](https://img-blog.csdnimg.cn/7209c8f3db49411dbd9b027ffad8b42b.png)
Vmware 虚拟机挂起恢复后发现无法 Ping 通,无法连接到主机
解决办法 进入对应主机中,切换到 root 账户,重启网络服务。 systemctl stop NetworkManager systemctl restart network在网上还找到了另一种解决方法: 在网卡配置文件中增加参数 NM_CONTROLLED"no"。 在 Centos 7 中修改如下所…...
![](https://img-blog.csdnimg.cn/3f127089a14c42f3bcb22da82d23dfab.gif)
Web自动化测试之图文验证码的解决方案
对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码, 验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂一点就是滑…...
![](https://www.ngui.cc/images/no-images.jpg)
软考高级系统架构设计师系列论文九十:论分布式数据库的设计与实现
软考高级系统架构设计师系列论文九十:论分布式数据库的设计与实现 一、分布式数据库相关知识点二、摘要三、正文四、总结一、分布式数据库相关知识点 软考高级系统架构设计师系列之:分布式存储技术...
![](https://www.ngui.cc/images/no-images.jpg)
Day 84:网络结构与参数
单层数据 package dl;/*** One layer, support all four layer types. The code mainly initializes, gets,* and sets variables. Essentially no algorithm is implemented.*/ public class CnnLayer {/*** The type of the layer.*/LayerTypeEnum type;/*** The number of …...
![](https://img-blog.csdnimg.cn/66433ef94b464db28d5d6d25a225f0d4.png)
vue2.6及以下版本导入 TDesign UI组件库
TDesign 官方文档:https://tdesign.tencent.com/vue/components/button 我们先打开一个普通的vue项目 然后 如果你是 vue 2.6 或者 低于 2.6 在终端执行 npm i tdesign-vue如果你是 2.7 或者更高 执行 npm i tdesign-vuenaruto这里 我们 以 2.6为例 因为大部分人 用vue2 都是…...
![](https://img-blog.csdnimg.cn/20210105230716542.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDI0Njg4,size_16,color_FFFFFF,t_70)
深圳代做网站/qq群引流推广平台
Web基本笔记~04.css入门 上一期 CSS 的引入方式 内联样式(行内样式) <p style"background: orange; font-size: 30px;">MyFirstCSS<p>内部样式 <html><head><meta charset"utf-8" /><title&g…...
![](/images/no-images.jpg)
做门窗投标网站/秦皇岛百度推广
国家示范性高职院校名单(109所) http://www.sina.com.cn 2011年07月15日 10:52 新浪教育 新浪教育讯 2006年11月,为了提升高职院校的办学水平,教育部启动了被称为“高职211”的“百所示范性高等职业院校建设工程”。根据规划,“十一五”期间…...
![](/images/no-images.jpg)
泰安北京网站建设/seo推广是做什么的
ikvmc 将 Java 字节码转换成 .NET dll 文件或是 .exe 文件。 本文内容 用法选项备注 例子用法 ikvmc [ options ] classOrJarfile [ classOrJarfile ... ] 其中, options 将在下面介绍。classOrJarfile 是 Java .class 文件或 jar 文件,可以包含通配符&…...
![](/images/no-images.jpg)
电商网站运营建设的目标/朋友圈推广一天30元
IS-IS和OSPF一样,都是一种基于链路状态并使用最短路径优先算法进行路由计算的一种IGP协议。IS-IS最初是国际化标准组织ISO为它的无连接网络协议CLNP设计的一种动态路由协议。 一、应用场景不同: OSPF:适用于区域多样、策略多变、调度精细 …...
![](https://img-blog.csdnimg.cn/def00240e43840c5abed5b33bf7b763b.png)
wordpress4.9升级失败/网络营销的推广
目录一,后端部署1,项目打包1.1,引入插件1.2,maven打包1.3,修改项目版本号1.4,验证1.5,生成配置文件2,服务器环境搭建2.1,安装JDK1)下载2)tar包安装…...
![](https://img-blog.csdnimg.cn/img_convert/269227c11c70c686ac87cd07a259acdd.png)
厦门做公司网站/手机系统优化工具
环境变量对于很多新手来说非常陌生,但对于有经验的UG工程师来说,如果你没有掌握一定的环境变量设置你还算不上一个资深工程师!因为设置环境变量可以减少繁锁的操作步骤,有效提高工作效率,以下为大家详细介绍。1、如果安…...