精华内容
下载资源
问答
  • 草地分为近景与远景,对比一下不难发现,我们在制作草地效果图时,远景的可以通过材质贴图实现,近景则需要实体模型营造真实感,当然也可以使用max自带的毛发系统制作近景草地模型大面积的野花模型。(~ o ~)~...

    8ab5a437e0887e03e3f0dc1146de8440.png

    草地是自然景观场景的一项重要元素,草地分为近景与远景,对比一下不难发现,我们在制作草地效果图时,远景的可以通过材质贴图实现,近景则需要实体模型营造真实感,当然也可以使用max自带的毛发系统制作近景草地模型和大面积的野花模型。(~ o ~)~下面我们开始闯关吧!

    2729560721e09605d569602ea810a00d.png

    第一关、草叶建模

    首先要制作一株单独的小草,根据草的分类,国内外研究了一番,草一般分为狼尾草,天堂草,结缕草,黑麦草,马尼拉草,台湾草,地毯草,狗尾巴草等等,由于我们要做近景效果,会对草叶的形态有特写,由于天堂草是单子叶植物,我们就取天堂草作为模型制作参考,建立面片后进行多边形编辑,不断的分段,慢慢调整出草的形态。

    1a547fe9545d41ab4a11e8e88c6f8ec5.png

    1.建立分段数平面→2.可编辑多边形→3.调整草的茎部形态→4.继续分段数,方便弯曲变形。

    d582e4eb8b20107f824578daf7cfd1d4.png

    5.草叶的形态调整完成→6.仅影响轴测,居中到对象,移动到草底部,旋转轴的方向,以备弯曲命令→7.采用弯曲命令进行调整。

    1d897bcf206cceb2b6f6634abfb01829.png

    8.复制出几株草,采用不同的弯曲方式及扭曲操作。由于草的生长规律比较随机,所以我们尽量调整不同的弯曲度以及草的大小,草叶的模型制作好了,这样方便一会儿绘制草。

    e94586585ce7b3d9fb4d9cddf9fd9e01.png

    第二关、草叶贴图

    1.接着,我们在photoshop里面制作草的贴图,创建一个1000X111大小的图像,然后在网络上找到一张贴图,扣出草叶的部分,拖拽到我们创建的图像里面,尽量ps成我们想要的颜色和也叶面的纹理效果。

    44edf49b173f60f5278070f5d2608032.png

    2.下面我们利用unwrap UVW展开贴图对草叶进行贴图,首先选择我们刚才制作好的草叶模型,在材质编辑器赋予草叶以贴图命令,转化为可编辑多边形后进行unwrap UVW,打开编辑命令,正常贴图,进行编辑,贴完后对其他的草叶进行贴图,然后复制粘贴到其他草叶

    89f0c26ff4299be75dea98d69778612f.png

    3.首先我们打开uw编辑器。

    42b207f1754911a6baa3f1168e3b0982.png

    4.选中我们的贴图→5.展平顶底贴图。

    dcfa3144b54b836b4b4ae6116aedd250.png

    6.旋转变形,对点进行缩放及移动操作。

    b8ee1d705f391e185742289a03871043.png

    7.是不是有点太慢了了…一步一步调整直到跟贴图匹配,这样还需要将unwrap UVW展开贴图复制到其他的草苗噢!⊙0⊙

    3162d7ef5162980017b26e7f32250604.png

    第三关、高级绘制

    1.下面我们绘制一个圆环作为参考地面,接着转化为可编辑多边形。

    52597e355f21a23130024927db5fab11.png

    2.高级绘制插件下载直接...

    95e47a50d3d5d8cde54bd98781b8782f.gif

    【www.3dxy.com】advpainter_1.5.1.rar 戳这里加入【3D学院交流群3】:274077844。同样运行脚本,随后弹出对话框说明已经安装完成→3.max自定义用户界面

    e173344e6f4a71733a8533f2485ea9ab.png

    4.下载安装好高级绘制插件后,我们开始使用吧!这个插件很好用,这个小脚本插件体积虽然小巧,而且是个老插件,功能却是异常的强大和实用。这个东西挺简单的但是用武之地颇多,比如我们在建模的过程中经常会遇到随机放置物体、栽花种草、放置毛发导线等事情,这些事情说大不大,但是都挺花时间的,这个小插件正好弥补了这个流程中的空缺..........在这里我们选择自由形式。

    ecb72871fd402f8ad5c0bb4bff18b049.png

    5.添加我们刚才的几株草叶,调整好最大值和最小值后,我们就可以进行绘制了。

    45a0131b0dfecce10c73a56e06fa66cb.png

    6.点击Paint绘制,这时我们要选取刚才我们创建好的圆环,像ps笔刷一样duang~的一下就绘制出了一堆草团。

    14d575fb352683437cce9e41133f2136.png

    7.为了避免占用太多点面数,我们讲草团可编辑多边形后,进行vray网格导出,保存一下文件。

    2bb95301a2da6b11eeea813aed9df89f.png

    第四关、快速地形

    1.新建一个场景快速创建地形,当然还有更多方法,免费观摩。3DMAX快速做地形的方法http://www.3dxy.com/3dmax/43.html

    4e507ffb909cc10dd141a1e472a233a5.png

    2.对平面转可编辑多边形后,进行变形绘制,像高版本的可以使用石墨工具也可以轻松实现,像ps里面的绘制工具一样。→3.给地形一个泥土的材质后,现在导入我们刚才的草堆模型。

    dee04e442ec3cd8d95915abc93bd8224.png

    4.现在我们开始使用Multiscatter工具种草,这也是一个插件

    MultiScatter创建森林甚至整个城市在眨眼间,很强大的大型场景渲染插件。

    f50d0f00c3fcc0285b2e1a1c745da327.png

    5.现在我们首先将所有物体成为一个默认物体→6.然后再分布里面拾取地面。

    a0a821f63ca0888bf9eaf5b031027424.png

    7.再添加刚才我们准备好的两个vray网格导出物体。设置好分布数量,将两个草堆物体设置成不同的形,并赋予不同的颜色,点的显示方式和使用物体的固有色会让整个场景显示方式更清晰明了,并且场景一点也不卡,这样我们就将草布置好了,可以尝试不同的数值查看效果,不懂的可以留言哈。

    f616084e394918ae93df6ec1bb938e51.png

    六、场景测试篇

    1.下面的场景测试主要是,使用vray物理相机和vraysun对场景进行调整和测试,对于近景的部分,我们要对地面进行局部强化处理,使草和地面更融合。

    9cb75f29a6749e2336e0b9d5340509ca.png

    2.渲染出图阶段,可以将渲染参数和出图尺寸调小一点,基本的设置可以参照3d学院里面关于vray的渲染教程,在这里就不展开叙述了。{{{(>_< )}}}

    def582782dfe1374658c4f97617f5ad3.png

    恭喜你闯关成功,效果图欣赏一下!------补充点无所谓的内容------随便说说的,轻喷。在使用Multiscatter工具种草时,如果发现地形太大了,可以边界线性剪切工具,减少了草分布的面积,只在摄像机的部分显示,这种形式在处理大场景时应该很实用哈!

    b4cb3d33abf6896f7833de1a10fe6067.png

    回顾一下整体的制作流程,从真实建模→高级绘制→快速地形→种草插件→场景测试,这5关就可以快速制作出满意的草地效果,清晰的思路讲解,以及好用的插件,关爱脑机的种草插件,再也不用担心电脑卡死的情况出现啦!只要你花足够的耐心,现在不用出门就可以制作出路边野花野草盛开的场景噢!

    这样就制作完成了,需要草地的模型和插件的同学欢迎私信 草地 获取,我会在第一时间回复给你们的,教程不易,还望支持

    展开全文
  • 项目地址...这次是使用OpenSL ES来一个音乐播放器,它能够播放m4a、mp3文件,并能够暂停和调整音量播放音乐需要一些步骤1.创建声音引擎首先创建声音引擎的对象接口 ...
    项目地址
    https://github.com/979451341/OpenSLAudio

    OpenSL ES 是基于NDK也就是c语言的底层开发音频的公开API,通过使用它能够做到标准化, 高性能,低响应时间的音频功能实现方法。

    这次是使用OpenSL ES来做一个音乐播放器,它能够播放m4a、mp3文件,并能够暂停和调整音量

    播放音乐需要做一些步骤

    1.创建声音引擎

    首先创建声音引擎的对象接口
        result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);

    然后实现它
        result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);

    从声音引擎的对象中抓取声音引擎
        result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);

    创建"输出混音器"
        result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 1, ids, req);

    实现输出混合音
        result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);


    2.创建声音播放器

    创建和实现播放器

        // realize the player
        result = (*bqPlayerObject)->Realize(bqPlayerObject, SL_BOOLEAN_FALSE);
        assert(SL_RESULT_SUCCESS == result);
        (void)result;
    
        // get the play interface
        result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_PLAY, &bqPlayerPlay);
        assert(SL_RESULT_SUCCESS == result);
        (void)result;

    3.设置播放缓冲

    数据格式配置

        SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_8,
                                       SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
                                       SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN};
    数据定位器 就是定位要播放声音数据的存放位置,分为4种:内存位置,输入/输出设备位置,缓冲区队列位置,和midi缓冲区队列位置。

    数据定位器配置

        SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};

    得到了缓存队列接口,并注册

        // get the buffer queue interface
        result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_BUFFERQUEUE,
                                                 &bqPlayerBufferQueue);
        assert(SL_RESULT_SUCCESS == result);
        (void)result;
    
        // register callback on the buffer queue
        result = (*bqPlayerBufferQueue)->RegisterCallback(bqPlayerBufferQueue, bqPlayerCallback, NULL);
        assert(SL_RESULT_SUCCESS == result);
        (void)result;

    4.获得其他接口用来控制播放


    得到声音特效接口

        // get the effect send interface
        result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_EFFECTSEND,
                                                 &bqPlayerEffectSend);
        assert(SL_RESULT_SUCCESS == result);
        (void)result;

    得到音量接口

        // get the volume interface
        result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_VOLUME, &bqPlayerVolume);
        assert(SL_RESULT_SUCCESS == result);
        (void)result;
    
        // set the player's state to playing
        result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING);
        assert(SL_RESULT_SUCCESS == result);
        (void)result;

    5.提供播放数据

    打开音乐文件

        // convert Java string to UTF-8
        const char *utf8 = (*env)->GetStringUTFChars(env, filename, NULL);
        assert(NULL != utf8);
    
        // use asset manager to open asset by filename
        AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
        assert(NULL != mgr);
        AAsset* asset = AAssetManager_open(mgr, utf8, AASSET_MODE_UNKNOWN);
    
        // release the Java string and UTF-8
        (*env)->ReleaseStringUTFChars(env, filename, utf8);
    
        // the asset might not be found
        if (NULL == asset) {
            return JNI_FALSE;
        }
    
        // open asset as file descriptor
        off_t start, length;
        int fd = AAsset_openFileDescriptor(asset, &start, &length);
        assert(0 <= fd);
        AAsset_close(asset);

    设置播放数据

        SLDataLocator_AndroidFD loc_fd = {SL_DATALOCATOR_ANDROIDFD, fd, start, length};
        SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED};
        SLDataSource audioSrc = {&loc_fd, &format_mime};

    6.播放音乐


    播放音乐只需要通过播放接口改变播放状态就可以了,暂停也是,停止也是,但是暂停必须之前的播放缓存做了才行,否则那暂停就相当于停止了

            result = (*fdPlayerPlay)->SetPlayState(fdPlayerPlay, isPlaying ?
                                                                 SL_PLAYSTATE_PLAYING : SL_PLAYSTATE_PAUSED);

    7.调解音量

    SLVolumeItf getVolume()
    {
        if (fdPlayerVolume != NULL)
            return fdPlayerVolume;
        else
            return bqPlayerVolume;
    }
    
    void Java_com_ywl5320_openslaudio_MainActivity_setVolumeAudioPlayer(JNIEnv* env, jclass clazz,
                                                                          jint millibel)
    {
        SLresult result;
        SLVolumeItf volumeItf = getVolume();
        if (NULL != volumeItf) {
            result = (*volumeItf)->SetVolumeLevel(volumeItf, millibel);
            assert(SL_RESULT_SUCCESS == result);
            (void)result;
        }
    }

    8.释放资源

    关闭app时释放占用资源

    void Java_com_ywl5320_openslaudio_MainActivity_shutdown(JNIEnv* env, jclass clazz)
    {
    
        // destroy buffer queue audio player object, and invalidate all associated interfaces
        if (bqPlayerObject != NULL) {
            (*bqPlayerObject)->Destroy(bqPlayerObject);
            bqPlayerObject = NULL;
            bqPlayerPlay = NULL;
            bqPlayerBufferQueue = NULL;
            bqPlayerEffectSend = NULL;
            bqPlayerMuteSolo = NULL;
            bqPlayerVolume = NULL;
        }
    
        // destroy file descriptor audio player object, and invalidate all associated interfaces
        if (fdPlayerObject != NULL) {
            (*fdPlayerObject)->Destroy(fdPlayerObject);
            fdPlayerObject = NULL;
            fdPlayerPlay = NULL;
            fdPlayerSeek = NULL;
            fdPlayerMuteSolo = NULL;
            fdPlayerVolume = NULL;
        }
    
    
    
        // destroy output mix object, and invalidate all associated interfaces
        if (outputMixObject != NULL) {
            (*outputMixObject)->Destroy(outputMixObject);
            outputMixObject = NULL;
            outputMixEnvironmentalReverb = NULL;
        }
    
        // destroy engine object, and invalidate all associated interfaces
        if (engineObject != NULL) {
            (*engineObject)->Destroy(engineObject);
            engineObject = NULL;
            engineEngine = NULL;
        }
    
    }
    参考文章
    http://blog.csdn.net/u013898698/article/details/72822595

    http://blog.csdn.net/ywl5320/article/details/78503768
    展开全文
  • 例如下图所示的Liu et al.(2019)的Table 2的Fama-MacBeth回归结果,每一列分别代表因变量不同自变量回归的结果,可以把不同的回归模型放在同一个表格里面进行比较,同时每一个参数下方的括号汇报了(经调整的...

    需求

    目前还没有在R里面发现可以直接生成金融学论文常见的表格样式的包,例如下图所示的Liu et al.(2019)的Table 2做的Fama-MacBeth回归结果,每一列分别代表因变量和不同自变量回归的结果,可以把不同的回归模型放在同一个表格里面进行比较,同时每一个参数下方的括号汇报了(经调整的)t统计量,最下面一行汇报了模型的一些参数。

    d9362d95faa6b04783e6e73d92a4f99b.png

    为了日常写论文时对比分析模型的方便,写了一些函数,可以直接用R生成上述表格。并且可以通过RMarkdown输出为htmldocx等格式

    目前还只能做到最简单的OLS回归(调用lm函数),t统计量也不能进行调整,但是可以很容易对函数进行修改以实现广义最小二乘(glm)、面板数据回归(plm)以及调整t统计量等功能。未来可能会在函数的参数里面加入这些功能,但目前来说已经够用了。

    函数目录

    提供如下几个函数

    • lmWithMultipleXY:针对一个数据集,使用不同的因变量对自变量的不同组合进行回归,返回一个list,里面每一个元素都是模型在lm函数下的拟合结果;
    • lmFitToPaperTable:把单个lm的输出做成论文的表格
    • MultiLmFitToPaperTable:多个lm对象输出为论文的格式,支持每一个lm对象的自变量不一样
    • exportFitPaperTable:把lmFitToPaperTableMultiLmFitToPaperTable输出的论文格式通过RMarkdown输出为htmldocxmd等格式

    例子

    函数会直接放在本文的最后,这一部分直接以例子来讲解函数的使用。我们以R自带的mtcars数据集进行分析。

    1. 不同的因变量对自变量的不同组合进行回归

    使用mpgcyl作为因变量分别对不同的变量组合进行回归,回归结果存在一个list里面,每一个元素都是某一个模型回归的结果。

    ys <- colnames(mtcars[1: 2])
    xs <- list(colnames(mtcars[3]), colnames(mtcars[3: 4]))
    
    fit <- lmWithMultipleXY(ys, xs, mtcars)
    fit_vars <- sapply(fit, function(x) all.vars(x[["terms"]]))
    print(fit_vars)
    
    # $mpg_x1
    # [1] "mpg"  "disp"
    # $mpg_x2
    # [1] "mpg"  "disp" "hp"  
    # $cyl_x1
    # [1] "cyl"  "disp"
    # $cyl_x2
    # [1] "cyl"  "disp" "hp"

    2. 回归结果制表

    单个回归结果制表,传入lm返回的对象

    fit_table_1 <- lmFitToPaperTable(fit[[1]])
    View(fit_table_1)

    建议结果直接在RStudio里面View,看起来更方便点

    7a17abe8299e0166b5642b1f698abf80.png

    把这个结果最简单粗暴地复制到Word文档里面的方法是,先在Excel里面把一部分区域的类型调整为“文本”格式(这样可以使括号在粘贴后不会消失),然后把View的结果包括列名全部选中复制,以文本格式在Excel里面粘贴,再进行调整即可:

    5f9e790ce765f4824e1e71b44e1ea538.png

    这个方法有一个缺点是*不是上标,最开始的处理方法是,表格粘贴到Word里面后,把*替换为上标,可以参考这篇《WORD中如何给内容批量加上标?》,不过只要不是要展示给别人,是不是上标影响不大。这里讲到的方法是为最开始使用的方法,在表格不多时也比较方便,但后面会讲如何用RMarkdown直接输出。

    另外,lmFitToPaperTable函数可以选择横表,括号里可以选择标准差,结果这里就不展示了。

    View(lmFitToPaperTable(fit[[1]], table_type="H"))
    View(lmFitToPaperTable(fit[[1]], stats_in_paren="Std. Error"))

    3. 多个回归结果制表

    传入lmFitToPaperTable函数返回的对象到MultiLmFitToPaperTable函数里面即可制表

    fit_table_2 <- MultiLmFitToPaperTable(fit)
    View(fit_table_2)

    674fa3d1e9e19cd0f859fcf80a9ecfe4.png

    这样就成功实现了增减控制变量后,不同模型一起比较的问题。输出到Word里面以及让*上标的方法和上一节提到的一样。

    同样的,MultiLmFitToPaperTable支持括号里是t值还是标准差

    View(MultiLmFitToPaperTable(fit, stats_in_paren="Std. Error"))

    4. 表格直接输出为文档

    通过向RMarkdown传参可以直接将表格输出为文档,exportFitPaperTable函数是这个功能的封装,默认输出html格式的文档,也可以输出docx格式的文档。并且通过运用markdown文档的数学公式语法,可以直接将*表示为上标。

    具体实现上,exportFitPaperTable函数将表格作为参数传入到rmd模板文件中,然后对表格格式进行优化,再输出为指定格式文档。

    例如下面的代码分别将MultiLmFitToPaperTable函数得到的表格输出为html和docx文档,默认在当前工作目录下。需要注意的是,fit_paper_table.Rmd这个文档是输出模板,需要预先放在目录里面。

    exportFitPaperTable(fit_table_2, rmd_file="./fit_paper_table.Rmd")
    exportFitPaperTable(fit_table_2, rmd_file="./fit_paper_table.Rmd", file_type="word")

    fa592c3d977fd88a020a334cf3ad0b59.png

    1a7c7d4eefb48d6bc89d2a08a8af69b8.png

    到目前为止,基本上实现了R调整控制变量的批量回归以及制作论文表格的全流程。

    然而目前输出到Word文档的方式仍然有一点问题,主要在于使用数学公式表达来处理*的上标问题,使得整个表格的数字部分全是公式格式,在表格太多时可能会影响word的性能,同时Word的数学公式的字体不是Times New Roman也有一点问题。当然,最优解可能是输出为markdown文档,然后在LaTeX​里面写作,然而当前这个函数直接输出为markdown文档还有些问题,后续再修复这个bug。

    函数

    下面展示了使用了的函数,注释部分表明了参数的用法

    ################ 批量回归 ####
    lmWithMultipleXY <- function(ys, xs, df, ...) {
      # 针对一个数据集,使用不同的因变量对自变量的不同组合进行回归,
      # 返回一个list,里面每一个元素都是模型在lm函数下的拟合结果
    
      # ys: 是一个向量,包含需要回归的y
      # xs: 是list,每一个元素是一个向量,包含需要回归的自变量组合
      # df: data.frame对象,回归数据集
      # ...: 任意传给lm函数的参数,例如subset,weights等等
    
      if(inherits(xs, "list") == FALSE) stop("xs必须为list")
    
      fit_lt <- list()
    
      cnt <- 1
      for(i in 1: length(ys)) {
        for(j in 1: length(xs)) {
          x <- xs[[j]]
          formula_i <- as.formula(paste0(ys[i], " ~ ."))
    
          fit_i <- lm(formula_i, df[, c(ys[i], x)], ...)
          fit_lt[[cnt]] <- fit_i
    
          cnt <- cnt + 1
        }
      }
      names(fit_lt) <- paste0(rep(ys, each=length(xs)), "_x", seq_along(xs))
    
      return(fit_lt)
    }
    
    
    ################ 输出格式调整 ####
    lmFitToPaperTable <- function(lm_list, table_type="V", stats_in_paren="t value") {
      # 把lm的输出做成论文的表格
      # H代表横着,V代表竖着
      # stats_in_paren表示估计出来的参数下方括号是什么可选:
      #   t值:"t value"
      #   标准差:"Std. Error"
      #   P值:"Pr(>|t|)"
    
      reg_stats_name <- c("R-Squared", "Observations")
      reg_stats_num <- length(reg_stats_name)
    
      lm_summary <- summary(lm_list)
      lm_coef <- lm_summary[["coefficients"]]
      coef_num <- nrow(lm_coef)
    
      res <- data.frame(matrix(NA, coef_num + reg_stats_num, 2))
      rownames(res) <- c(rownames(lm_coef), reg_stats_name)
    
      # 估计参数的星星
      # 这里调整*的分位数
      lm_est <- formatDecimal(lm_coef[, "Estimate"], 4)
      lm_est_p_star <- symnum(lm_coef[, "Pr(>|t|)"], corr=FALSE, na=FALSE, 
                              cutpoints=c(0, 0.01, 0.05, 0.1, 1), symbols=c("***", "**", "*", ""))
      lm_est <- paste0(lm_est, lm_est_p_star)
      res[1: coef_num, 1] <- lm_est
    
      # 标准差/t值/P值
      res[1: coef_num, 2] <- paste0("(", formatDecimal(lm_coef[, stats_in_paren], 2), ")")
    
      # 统计量
      res["R-Squared", 1] <- formatDecimal(lm_summary[["adj.r.squared"]], 4)
      res["Observations", 1] <- length(lm_summary[["residuals"]])  # 估计数量
    
      res[is.na(res)] <- ""
    
      if(table_type == "H") {
        return(t(res))
    
      } else if(table_type == "V") {
        new_res <- generateVerticalPaperTable(rownames(lm_coef), reg_stats_name)
    
        new_res[seq(1, coef_num * 2, 2), 2] <- res[1: coef_num, 1]
        new_res[seq(2, coef_num * 2, 2), 2] <- res[1: coef_num, 2]
        new_res[(coef_num * 2 + 1): (coef_num * 2 + reg_stats_num), 2] <- res[reg_stats_name, 1]
    
        return(new_res)
      }
    }
    
    
    MultiLmFitToPaperTable <- function(fit_lt, stats_in_paren="t value", reg_stats=c("R-Squared", "Observations")) {
      # 多个lm对象输出为论文的格式,只能以列的方式输出
      # reg_stats是放在表格最后,展示回归信息的统计量,和lmFitToPaperTable挂钩
      
      fit_table <- lapply(fit_lt, function(x) lmFitToPaperTable(x, table_type="V", stats_in_paren=stats_in_paren))
      
      # 最终的第一列参数名称,要保证顺序不变
      table_x <- c()
      for(i in 1: length(fit_lt)) {
        table_x <- unique(c(table_x, names(coef(fit_lt[[i]]))))
      }
      
      # 把参数值按照最终变量名称填入到表格中
      new_fit_table_lt <- list()
      for(i in 1: length(fit_table)) {
        blank_table <- generateVerticalPaperTable(table_x, reg_stats)
        fit_table_i <- fit_table[[i]]
        
        x <- names(coef(fit_lt[[i]]))
        x_index <- rep(NA, length(x) * 2)
        x_index[seq(1, length(x_index) - 1, 2)] <- match(x, blank_table[, 1])
        x_index[seq(2, length(x_index), 2)] <- match(x, blank_table[, 1]) + 1
        
        blank_table[x_index, "Value"] <- fit_table_i[1: length(x_index), "Value"]
        blank_table[match(reg_stats, blank_table[, 1]), "Value"] <- fit_table_i[match(reg_stats, fit_table_i[, 1]), "Value"]
        
        new_fit_table_lt[[i]] <- blank_table
      }
      
      res <- data.frame(new_fit_table_lt[[1]][, 1], sapply(new_fit_table_lt, function(x) x[, 2]), stringsAsFactors=FALSE)
      
      colnames(res)[1] <- ""
      
      if(is.null(names(fit_lt))) {
        colnames(res)[2: ncol(res)] <- paste0("Fit_", 1: length(fit_lt))
      } else {
        colnames(res)[2: ncol(res)] <- names(fit_lt)
      }
      
      return(res)
    }
    
    
    formatDecimal <- function(x, k) {
      trimws(format(round(x, k), nsmall=k))
    }
    
    
    generateVerticalPaperTable <- function(coef_name, reg_stats_name=c("R-Squared", "Observations")) {
      coef_num <- length(coef_name)
      reg_stats_num <- length(reg_stats_name)
    
      res <- data.frame(matrix("", coef_num * 2 + reg_stats_num, 2), stringsAsFactors=F)
      colnames(res) <- c("", "Value")
      res[c(seq(1, coef_num * 2, 2), (coef_num * 2 + 1): (coef_num * 2 + reg_stats_num)), 1] <- c(coef_name, reg_stats_name)
    
      return(res)
    }
    
    
    ################ 输出为文档 ####
    exportFitPaperTable <- function(fit_paper_table, rmd_file="./fit_paper_table.Rmd", output_dir="./", 
                                    output_file_name="fit_paper_table", file_type="html", open_file=FALSE) {
      # rmd_file rmd文档的路径
      # output_dir 是输出文件的路径,默认当前工作目录
      # output_file_name 输出文件的名称,不带后缀
      # file_type 输出的文件格式,支持"html","word"
      # open_file 报告生成后,是否直接打开文档。HTML可以在浏览器内打开
    
      switch(file_type, 
             html = {output_format <- "html_document"; output_file_name <- paste0(output_file_name, ".html")},
             word = {output_format <- "word_document"; output_file_name <- paste0(output_file_name, ".docx")})
    
      # 复制一个临时文档
      temp_file <- file.path(tempdir(), "fit_paper_table.Rmd")
      file.copy(rmd_file, temp_file, overwrite=TRUE)
    
      # 输出
      rmarkdown::render(temp_file, 
                        output_format=output_format, output_file=output_file_name, output_dir=output_dir, 
                        params=list(fit_paper_table=fit_paper_table),
                        quiet=TRUE)
    
      if(open_file) {
        file.show(paste0(output_dir, "/", output_file_name))
      }
    
    }

    下面是fit_paper_table.Rmd的RMarkdown文件内容

    ---
    title: "回归结果"
    params:
      "fit_paper_table": NULL
      
    ---
    
    ```{r results='asis', echo=FALSE}
    library(knitr)
    fit_paper_table <- params[["fit_paper_table"]]
    
    # 把*、**、***变成上标,方式为转换成^{*}、^{**}、^{***}并在前后加上$号,markdown可以渲染成数学符号
    # 这里使用了正则表达式里面的 “?<= ... 正后发断言”,参考下面链接4.3节
    # https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md
    
    fit_paper_table <- apply(fit_paper_table, 2, function(x) sub("(?<=[0-9])([*]{1}$)", "^{*}", x, perl=TRUE))
    fit_paper_table <- apply(fit_paper_table, 2, function(x) sub("(?<=[0-9])([*]{2}$)", "^{**}", x, perl=TRUE))
    fit_paper_table <- apply(fit_paper_table, 2, function(x) sub("(?<=[0-9])([*]{3}$)", "^{***}", x, perl=TRUE))
    fit_paper_table[, -1] <- apply(fit_paper_table[, -1], 2, function(x) paste0("$", x, "$"))
    fit_paper_table[, -1] <- apply(fit_paper_table[, -1], 2, function(x) sub("$$", "", x, perl=TRUE))
    
    kable(fit_paper_table)
    ```
    展开全文
  • 指导朋友胆机的时候总是遇到这样一个问题:胆机是按照图纸一步一步制作的,元件也是按照电路图基本参数购买的。可大部分情况是机器焊接完成后测量各重要点电压与图纸对比相差较多。我遇到的几个朋友走到这一步就不...

    指导朋友做胆机的时候总是遇到这样一个问题:胆机是按照图纸一步一步制作的,元件也是按照电路图基本参数购买的。

    可大部分情况是机器焊接完成后测量各重要点电压与图纸对比相差较多。

    我遇到的几个朋友走到这一步就不知道怎么调整了。

    其实这个问题属于正常现象。我们即使严格按照图纸焊接,也会因为变压器内阻,扼流圈内阻,和电子管参数不一致而造成实际测量各点电压与图纸不符合。如果差的少,声音正常,也就不用调整了。

    但是如果相差较多。甚至都影响到声音了。就需要调整了。

    自制6P14胆机试听请点击链接:电子管功放机6P14单端胆机音质怎么样?试听一首无损音乐《童年》

    拿下面这张6P14举个例子:

    f42b127e0cdd4ca2394a7995187b8f03.png

    这个图上我画出来的圈里面都是关键位置电压,实际制作当中经常会出现不一致的情况。那么我们怎么去调整呢?

    如果是65v前级阳极电压相差较多,就主要调整下面图片里面两个电阻值,

    如果是后级管阳极电压270v电压高就需要再电感后面加电阻调节,如图所示:

    030b96818565f913a3819f64f54760e4.png

    这个说起来很容易,但需要细心反复测量,阳极电压高就加阻值,阳极电压低就减阻值。

    如果是阴极电压不正常就需要微调阴极电阻:

    871d7202d898affa67678f575fa8ce86.png

    一般来说如果阳极电压正常了,管子没有问题,阴极电压就会和图纸很接近。声音也就正常了。

    经过反复调整,还是不行就对换一下管子。因为也不能排除管子有问题。

    上面是说的加减电阻,有的朋友问了,那加减电阻怎么计算呢?其实每个管子参数上都有正常阳极电流数据。知道电流了,知道相差电压是多少了,电压÷电流得数大概就是需要增减的电阻值了。当然理论归理论,还是以实际调整为准。

    经过上面的调整。我指导的网友制作的胆机都成功出声了。

    欢迎大家把经验分享一下,谢谢!

    文 自由自在的心灵 20200218

    展开全文
  • 例如下图所示的Liu et al.(2019)的Table 2的Fama-MacBeth回归结果,每一列分别代表因变量不同自变量回归的结果,可以把不同的回归模型放在同一个表格里面进行比较,同时每一个参数下方的括号汇报了(经调整的...
  • 制作一份专业的PPT图表,说服领导客户,是每一位职场人士的方案汇报的关键。知名咨询公司麦肯锡之所以能在任何领域获得客户的认可,其原因之一就是因为他们的图表制作专业且有说服力。什么样的PPT图表才是大家...
  • 项目地址...这次是使用OpenSL ES来一个音乐播放器,它能够播放m4a、mp3文件,并能够暂停和调整音量播放音乐需要一些步骤 1.创建声音引擎 首先创建声音引擎的对象接口...
  • 4月13日下午消息,移动社交应用陌陌近期在产品上了重要调整,将“直播”功能了产品战略级提升,取代了类似朋友圈的“发现”。值得一提的是,陌陌董事长兼CEO唐岩多次上阵直播个人工作生活。 陌陌此前并没有...
  • 走了很多弯路查找了很多的资料才知道原来制作大容量IMG文件或者任意调整IMG文件容量是非常容易的事情,只要留心细节就可以了,所以将自己的心得整理并放上来个记号,也许以后忘记了还能在这里再次查找到。...
  • 用Excel饼图很简单,选取表格 - 插入 - 饼图。但双层的你会吗?【例】下图为各品牌家电的利润统计数据。...制作步骤1、插入饼图按Ctrl键选取A列D列,插入饼图2、添加新系列选取饼图 - 右键菜单中点选择数据 ...
  • 对www.dbanotes.net 了彻底的调整

    千次阅读 2004-11-11 23:02:00
    对www.dbanotes.net 了彻底的调整发表人:Fenng | 发表时间: 2004年十一月11日, 11:20最近用空余时间改造 www.dbanotes.net的变动包括:1 完全用xhtml+css 打造,CSSXHTML均通过校验--光弄这个就费了不少时间...
  • 上一篇博文我们整合了Amaze ui,并且调整了一个头部header底部footer文件,其实起来也很简单,只要按照步骤来,完全没有问题。今天我们来重新调整一下列表页面内容页面,使我们的后台管理系统更有范儿。 ...
  • 上一篇博文我们整合了Amaze ui,并且调整了一个头部header底部footer文件,其实起来也很简单,只要按照步骤来,完全没有问题。今天我们来重新调整一下列表页面内容页面,使我们的后台管理系统更有范儿。 ...
  • 想了解流程图如何制作之前,先要了解流程图制作软件,如果你不知道怎么选择,可以参考《流程图用什么软件比较方便》这篇教程,这边说下常用的Word/WPS两款...3、插入“文本框”,输入文字,调整大小位置。4、简...
  • 养老金计发上不封顶 每多缴一年多发一个百分点 时间:2005-12-15 10:26 来源:新华社 《国务院关于完善企业... 决定在完善企业职工基本养老保险制度的指导思想、扩大基本养老保险覆盖范围、逐步实个人账户改革基本
  • 给宝宝一个cocos免费游戏 第一章 背景开发框架介绍 第二章 Node树场景制作 第三章 UI、地图关卡文本制作 ...添加属性和调整动作4.保存动作三、js空值角色动作1.根据摇杆变化执行行走转向等动作2.按下按键释
  • 今年百度大面积的对网站进行排名算法调整作为一个 seoer 需要时时关注这些消息 今天我们就来看看 2016 年百度算法了哪些调整 总共整理了 24 条包括时间调整 网站 排名因素调整和降权调整需要的朋友可以参考下 2016...
  • 照着这篇的,但是标题样式要设置成段落 否则就会报错说找不到目录项 调整目录的页码文章页脚 修改目录的字体方法
  • 图表,一直是Excel汇报时的重要元素,往往因其独具特色的展现表达,将问题数据结果简单化,形象化……但制作Excel图表时,我们往往感叹,为什么我的图表是这样?没有层次感,很普通,基本就是往图表圈中一扔,连个...
  • 全景制作后期拼接全景图怎么

    千次阅读 2019-09-25 15:59:07
    今天大家讲一下全景后期拼接制作的相关问题: 1、拍攝 我们需要拍摄360度的照片,相邻角度的两张照片照片需要30%-40%的重复区域,这是为了我们后期制作时的方便性。 以gopro为例,相机处于水平状态下拍摄景物一圈...
  • 大家分享一下制作双层饼图的方法教程!让你工作汇报更出彩!效果图如下:操作步骤:第一步:插入饼图选中“地区”“总计”列,然后点击插入——图表——插入饼图或圆环图,之后选择二维饼图即可。第二步:添加...
  • 昨天文章的头图,貌似反馈还不错,挺多人比较感兴趣。所以,今天就分享一下,这种文字排版效果,是怎么出来的。而且今天的实现手法与效果,了一些优化,比昨天的效果更好,有兴趣可以先...渐变的色值角度等...
  • 我们还是以之前的推文Graphpad折线图中的那个折线图为例来大家简单交流一下折线图的作图思想。1.当我看到这个折线图时,一看有两组(LFHF),那么我在想用grouped数据类型可以做到吗?于是我就选择了grouped数据...
  • 原标题:巧用CorelDRAW X7制作波纹效果文字本篇教程通过使用制作波纹效果文字标志的学习,介绍使用CDR制作字体标识的... 1、字之前,先统一字体笔画的粗细大小,方便掌握字体的整个结构。如图,外框用来囊括整...
  • 性能调整

    2007-10-22 09:31:00
    适合于小表(几千至几万条)与大表联接,在联接列上有索引。 分内表外表(驱动表),靠近from子句的是内表。从效率上讲,小表应该外表,大表应该内表,即大表查询时走索引。 注意:如果一个表有索引,一个表没有...
  • 教你制作立体的丝带效果一样,主要是考究锚点以及手柄的调整:来吧,今天我们就用AiPs制作这幅简约的扭曲效果海报吧!教程步骤—打开Ai,新建画板,尺寸随意:为了方便观察,先给个背景色吧,在画板上画一个矩形,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,394
精华内容 557
关键字:

做调整和作调整