小编Max*_*m.K的帖子

解释一个懒惰的评价怪癖

我正在阅读Hadley Wickhams关于Github的书,特别是关于懒惰评估的这一部分.在那里,他举例说明了懒惰评估的后果,在有add/adders功能的部分.让我引用一下:

在使用lapply或循环创建闭包时,[懒惰评估]很重要:

add <- function(x) {
  function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)
Run Code Online (Sandbox Code Playgroud)

在第一次调用其中一个加法器函数时,会对x进行延迟计算.此时,循环完成,x的最终值为10.因此,所有加法器函数都会在其输入上添加10,可能不是您想要的!手动强制评估修复了问题:

add <- function(x) {
  force(x)
  function(y) x + y
}
adders2 <- lapply(1:10, add)
adders2[[1]](10)
adders2[[10]](10)
Run Code Online (Sandbox Code Playgroud)

我似乎不明白那一点,而且那里的解释很少.有人可以详细说明这个特定的例子,并解释那里发生了什么?我特别对句子感到困惑"此时,循环完成,x的最终值为10".什么循环?什么最终价值,在哪里?一定是简单的我想念,但我只是没有看到它.非常感谢提前.

r lazy-evaluation

60
推荐指数
2
解决办法
4003
查看次数

ggplot2图形质量闪亮的shinyapps.io

问题摘要:当在shinyapps.io上托管时,ggplot2图表的闪亮质量似乎很差.图形元素包含可见的缺陷,例如geom_point()不是圆形的点,有些看起来像三角形,有些像矩形等.图例看起来好像是从低分辨率的jpg中被炸毁了.我的例子就在这里.

问题:是否有任何控制图形质量的选项,例如dpi?

详细说明:开发一个简单的Shiny应用程序,我注意到ggplot图表边缘有点粗糙,无法改善这种情况.该示例应用程序说明了这一点做得不够好,注意点如何似乎是不规则形状的.当我将变焦(在Chrome中)增加到200%或更多时,它们的形状会改善,接近圆形度.在100%缩放时,整个图形看起来很奇怪而且不平滑.好像当图像分辨率降低了0.77或类似的因素时,你会得到轻微的失真伪影; 类似的效果在这里.最简单的方法是以100%缩放(右键单击,另存为)下载图像,然后在本地副本上增加缩放.你会看到点是如何远离圆形的.代码server.Rui.R非常简单:

# ui.R

shinyUI(fluidPage(
    titlePanel("My Shiny App"),
    sidebarLayout(
        sidebarPanel(
            h4("The graph looks rough")),
        mainPanel(
            plotOutput("myplot",width=800,height=600)
        )
    )
))
Run Code Online (Sandbox Code Playgroud)

# server.R

library(ggplot2)
data(mtcars)

shinyServer(
    function(input, output) {
        output$myplot <- renderPlot({
            p <- ggplot(data=mtcars,aes(x=mpg,y=disp,color=factor(cyl)))
            p <- p + geom_point()
            print(p)
        })
    }
)
Run Code Online (Sandbox Code Playgroud)

我很好奇这是否可以改善.Shiny是一种传达科学结果的强大工具,但这些视觉文物会以某种方式破坏哇哇效果.谢谢!

编辑:可能更正确的方式来表达问题是说默认的PNG图像中没有抗锯齿.

编辑2:这个问题是更多的价值,其他SO用户,这里有图前和使用(在浏览器中使用变焦,在差异更好看)开罗装置后的截图:

没有开罗图 用开罗图

r graph ggplot2 shiny

16
推荐指数
1
解决办法
3667
查看次数

Knitr内联块选项(无评估)或仅渲染突出显示的代码

我找不到有关是否可以在knitr中指定内联块的选项的信息.我只是尝试指定它们,就像在常规块中一样,但这会产生错误.

我需要的是在PDF中包含突出显示的R代码​​,但不进行评估.由于上下文的格式,这只能在内联块中发生.或许还有另一种方法可以包含突出显示的代码.

举一个例子,我需要以下几点:

Some text about something with `r eval=FALSE 1+1` inside the sentence. 
Run Code Online (Sandbox Code Playgroud)

这个特殊的语法给出:

Error in parse(text = code, keep.source = FALSE) :
<text>:1:11: unexpected ','
1: eval=FALSE,
Run Code Online (Sandbox Code Playgroud)

r syntax-highlighting knitr

12
推荐指数
1
解决办法
2626
查看次数

禁用柱形格式化的tibble打印

从版本1.4.1开始,tibbleprint方法似乎正在使用pillar包实现的其他格式(https://rdrr.io/cran/tibble/f/NEWS.md).后者尝试输出尽可能多的列,缩短一些值.是否可以禁用此格式并返回之前存在的打印方法?在某些情况下,通过输出额外的列并缩短值,柱子使得难以读取第一列的内容,这通常是分析师的意图.

很难提供可重复的示例,因为输出和格式化将取决于您的特定显示的具体情况.我希望这个问题很简单:如何禁用tibble打印的支柱格式化(例如在控制台中).

编辑:在tibble github存储库上提出了同样的问题:https://github.com/tidyverse/tibble/issues/361#issuecomment-357233716.似乎目前无法禁用格式化.可以提供一些选项,包的开发版本(在撰写本文时)确实可以更好地进行格式化.但是,它仍然不完美,可能会截断重要信息(另请参阅github讨论涉及的问题).因此,禁用格式仍然是某些用户可能想要实现的.

r tibble

12
推荐指数
1
解决办法
520
查看次数

ggplot2:单行中具有不同变量的多个图,单个分组图例

虽然有一些主题在同一个方向上进行,但我没有找到任何可以解决我的问题的具体方法.因此,一个新的主题,并提前感谢所有的帮助.

情况

我有两个图,需要横向放在一个图中,例如:

library(ggplot2)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]    
p1 <- qplot(price, carat, data=dsamp, colour=clarity)
p2 <- qplot(price, depth, data=dsamp, colour=clarity)
Run Code Online (Sandbox Code Playgroud)

虽然因变量每个图不同,但分组和独立性保持不变.因此,我只需要图中的一个图例来描述这些组.

我尝试了什么,什么不起作用

我试图使用R Cookbook中描述的解决方案.multiplot()该页面上给出的自定义函数使得图表没有图例就可以了.但是,如果只需要一个图例,则该功能失败.由于其中一个图形将包含图例,而另一个图形不包含图形,因此两个图形的宽度相互之间会有所不同(请从提到链接中复制多色函数):

multiplot(p1 + theme(legend.position = "none"),p2,cols=2)
Run Code Online (Sandbox Code Playgroud)

我发现的另一个可能的解决方案是包gridExtra,使用此代码示例.除了图表是垂直排列外,它几乎可以满足我的需要.我尝试使用函数参数,但无法想象如何水平排列图.希望有人对该包/问题有更多的经验.谢谢!

r ggplot2

9
推荐指数
1
解决办法
8541
查看次数

Git,Dropbox和Rstudio

我使用Dropbox将我的RStudio项目同步到多台机器上.我还使用Git在外部站点上备份我的代码.现在,这是问题所在.当我启动RStudio时,Dropbox会疯狂地尝试索引文件.git/index.lock.我已检查该文件是否出现并从项目文件夹的.git子文件夹中消失.它非常快速地执行,您必须不断地按住"刷新"快捷方式才能看到它.因此,Dropbox占用了整个CPU内核,导致CPU风扇以100%旋转.我已禁用同步常见问题中其他地方描述的同步.Rproj.user文件夹,但这似乎是一个无关的问题.

目前我必须手动暂停Dropbox以避免浪费CPU和电源,但是找到这种行为背后的原因会很好.RStudio支持建议关闭.git文件夹的同步.我不是100%熟悉Git,当我从不同的非同步机器提交时,这不会产生冲突吗?为什么index.lock文件会快速出现?上面提到的支持说这是Dropbox和Git之间的问题,而不是RStudio.而且,问题出现在一些项目中,而不是其他项目,我无法查明罪魁祸首.谢谢你的任何建议!

git dropbox rstudio

9
推荐指数
1
解决办法
904
查看次数

Knitr:Markdown文档中LaTeX环境中的R代码

我在Markdown中有一个文档,它包含R代码Knitr.对于渲染方程式,我使用LaTeX,只需在文本中编写命令即可.说我有以下LaTeX代码:

\begin{displaymath}
\mathbf{X} = \begin{bmatrix}
2 & 12\\ 
3 & 17\\ 
5 & 10\\ 
7 & 18\\ 
9 & 13\\
\end{bmatrix}
\end{displaymath}
Run Code Online (Sandbox Code Playgroud)

当我将所有内容转换为PDF(然后完整的工作流程为:RMD - > knitr - > MD - > pandoc - > TeX - > pandoc - > PDF)时,这给我一个很好的数学矩阵表示(方括号).

现在,假设我们希望从R对象(一些R矩阵)即时生成所述矩阵x.在这篇文章中,我们建立了如何生成所需的LaTeX代码(该matrix2latex()函数在那里定义).现在的问题是如何Knitr评估它.我尝试了以下代码:

\begin{displaymath}
\mathbf{X} = `r matrix2latex(x)`
\end{displaymath} 
Run Code Online (Sandbox Code Playgroud)

但它只是产生R输出所在的空白区域(实际为NULL).我很惊讶这已经没有被问过了(至少我自己的搜索没有产生任何结果).任何想法如何使这项工作?

编辑:

正如所建议的那样,重写函数没有cat().以下是该函数的工作版本以供将来参考:

m2l <- function(matr) {

    printmrow <- function(x) {

        ret <- paste(paste(x,collapse = " & "),"\\\\")
        sprintf(ret)
    } …
Run Code Online (Sandbox Code Playgroud)

markdown latex r pandoc knitr

9
推荐指数
1
解决办法
2204
查看次数

优化:将数据帧拆分为数据帧列表,每行转换数据

预备:这个问题大多具有教育价值,即使方法不完全是最优的,手头的实际任务也已完成.我的问题是下面的代码是否可以针对速度进行优化和/或更优雅地实现.也许使用其他包,例如plyr或reshape.运行实际数据需要大约140秒,远远高于模拟数据,因为一些原始行只包含NA,并且必须进行额外的检查.为了比较,模拟数据在大约30秒内处理.

条件:数据集包含360个变量,是12个集合的30倍.我们将它们命名为V1_1,V1_2 ......(第一组),V2_1,V2_2 ......(第二组)等等.每组12个变量包含二分(是/否)响应,实际上对应于职业状态.例如:工作(是/否),学习(是/否)等等,总共12种状态,重复30次.

任务:手头的任务是将每组12个二分变量重新编码为具有12个响应类别的单个变量(例如,工作,研究......).最终我们应该得到30个变量,每个变量有12个响应类别.

数据:我无法发布实际数据集,但这是一个很好的模拟近似值:

randomRow <- function() {
  # make a row with a single 1 and some NA's
  sample(x=c(rep(0,9),1,NA,NA),size=12,replace=F) 
}

# create a data frame with 12 variables and 1500 cases
makeDf <- function() {
  data <- matrix(NA,ncol=12,nrow=1500)
  for (i in 1:1500) {
    data[i,] <- randomRow()
  }
  return(data)
}

mydata <- NULL

# combine 30 of these dataframes horizontally
for (i in 1:30) {
  mydata <- cbind(mydata,makeDf())
}
mydata …
Run Code Online (Sandbox Code Playgroud)

optimization r apply

8
推荐指数
2
解决办法
1218
查看次数

R计算:AMD还是英特尔?

我正在构建一台办公室PC,其中最重要的任务是在R中运行蒙特卡罗马尔可夫链(MCMC)估计.显然,这是一项CPU密集型任务,而R仅限于单核.

鉴于预算有限,哪个CPU更适合任务,AMD还是英特尔?特别是,我正在研究英特尔酷睿i3 4130,其中两个内核时钟频率为3.4 Ghz,AMD FX-6300,六个内核时钟频率为3.5 Ghz,解锁倍频器.鉴于R的局限性,在重型计算任务中哪一个在性能方面更好?

谢谢.

编辑:我能在这个问题上找到的唯一信息就是这个FAQ项目:

2.23为什么R从不使用超过50%的CPU?这是对Windows令人困惑的任务管理器的误读.R的计算是单线程的,因此它不能使用多个CPU.任务管理器显示的不是CPU中的使用情况,而是使用占CPU表观总数的百分比.我们说"明显",因为它处理所谓的"超线程"CPU,例如每个核心两个CPU,而大多数现代CPU至少有两个核心.

我是否理解如果R只能使用单个CPU线程,那么英特尔的超线程无关紧要,因此AMD更高的时钟将具有优势?

EDIT2:这里有几个有点相关的基准测试,虽然他们不比较CPU,只是有和没有超线程的速度.

编辑3:这个主题是关于同样的问题,尽管用不同的术语表达.虽然没有太大的决议.

EDIT4:我找到了答案,但由于我怀疑这个问题会重新开放,我会在这里引用它.请参阅我对以下主要帖子的评论.

正确答案是AMD(给出这个特殊选择).如果存在计算困难,例如需要运行非常长的MCMC链,则可以使用JAGS或BUGS与R包,例如BRugs,R2WinBUGS,runjags和rjags.在这种情况下,可以在不同的核心上为相同的参数运行多个链,并在事后组合它们.这个视频解释了它.内核越多,链越多,因此具有六个内核的AMD优于具有4个(超线程)内核的Intel.

例如,在六核AMD上我将同时运行六个链:

library(R2WinBUGS)
re.sim<-bugs(data, inits, parameters, "model.bug", n.chains=6, n.iter=100000,
n.burnin=3000, n.thin=2, debug=F, program="openbugs")
Run Code Online (Sandbox Code Playgroud)

在Intel CPU上,我可以同时运行四个链,并且时钟频率较低.值得注意的是,runjags库允许并行执行,包括多机群集.

我认为那些将这篇文章标记为偏离主题的人认为它是一个非常广泛的问题,而事实上它是一个非常狭隘的问题,需要R的知识,软件R接口,MCMC是什么和做什么,以及如何所有这有关于uzilizing CPU power的结合.我提供的答案根本不是主观的,它与编写复杂的贝叶斯模型直接相关.投票重新开放,标记为偏离主题可能是由于对MCMC所要求的无知,而是集中在"AMD vs"上英特尔"红鲱鱼.

cpu performance r

7
推荐指数
1
解决办法
3246
查看次数

从SPELL数据创建序列对象

我正在尝试seqdef使用SPELL格式创建一个序列对象.以下是我的数据示例:

spell <- structure(list(ID = c(1, 3, 3, 4, 5, 5, 6, 8, 9, 10, 11, 11, 
12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 
15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 
19), status = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 2, 3, 1, 2, 3, 2, 3, 1, 1, …
Run Code Online (Sandbox Code Playgroud)

r traminer

6
推荐指数
1
解决办法
733
查看次数

在数学或方程环境中将R矩阵转换为LaTeX矩阵

假设有一个R矩阵x:

x <- structure(c(2, 3, 5, 7, 9, 12, 17, 10, 18, 13), .Dim = c(5L,2L), .Dimnames = list(NULL, c("X1", "X2")))
Run Code Online (Sandbox Code Playgroud)

我正在使用Markdown-pandoc-LaTeX工作流程编写一份包含LaTeX方程的报告.x是需要出现在这些方程中的矩阵之一.是否有可能以编程方式呈现矩阵的LaTeX表示如下?:

\begin{bmatrix}
2 & 12\\ 
3 & 17\\ 
5 & 10\\ 
7 & 18\\ 
9 & 13
\end{bmatrix}
Run Code Online (Sandbox Code Playgroud)

理想情况下,报告代码将是以下内容:

\begin{displaymath}
\mathbf{X} = `r whatever-R-code-to-render-X`
\end{displaymath}
Run Code Online (Sandbox Code Playgroud)

但这可能很麻烦,所以我肯定会接受简单的改造.

latex r knitr

6
推荐指数
2
解决办法
3866
查看次数

使用 R 在 Excel 工作表中创建图表

我正在使用openXLSX包从我的R输出中生成 excel 文件。
我找不到将 excel 图表添加到 excel 工作簿的方法。
我看到它python有一个用于创建 Excel 文件的模块,该模块有一个用于添加 Excel 图表的类。
有没有办法用 R 做到这一点?

excel r

5
推荐指数
2
解决办法
7968
查看次数

R shinydashboard:将div样式宽度参数指定为百分比以适合可调整大小的JS图

任务:使用Rshinydashboard在仪表板主体中嵌入自定义Javascript生成的绘图.指定绘图的宽度为百分比,以便绘图占据其列(或框),无论查看者的屏幕设置如何.

设置:R(3.5.2),shiny(1.2.0)和shinydashboard(0.7.1).仪表板代码(简化的可重现示例)如下:

library(shiny)
library(shinydashboard)

ui <- fluidPage(

dashboardPage(
    dashboardHeader(),
    dashboardSidebar(
        sidebarMenu(
            menuItem("Main", tabName = "tab1", icon = icon("dashboard")
            )
        )
    ),
    dashboardBody(
        tabItems(
            tabItem("tab1",
                    column(width = 12, 
                           tags$div(id = "main", style = "width: 100%; height: 400px"),
                           tags$script(src = "http://cdnjs.cloudflare.com/ajax/libs/echarts/4.1.0/echarts.min.js"),
                           tags$script(src = "myscript.js")
                    )
            )
        )
    )
 )
)


server <- function(input, output) {

}

# Run the application 
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

相应的Javascript文件myscript.js …

html javascript r shiny shinydashboard

5
推荐指数
1
解决办法
419
查看次数