小编day*_*yne的帖子

使用带有变量r的表达式

我试图用以下标签标记一个情节:

"一些分析EC50(uM)",其中"u"是微观符号.

我目前有:

assay <- "Some Assay"
plot(0,xlab=expression(paste(assay," AC50 (",mu,"M)",sep="")))
Run Code Online (Sandbox Code Playgroud)

但这给出了:"测定EC50(uM)"而不是所需的"某些测定EC50(uM)".

建议?谢谢.

我也尝试过:

paste(assay,expression(paste(" AC50 (",mu,"M)",sep="")),sep="")
Run Code Online (Sandbox Code Playgroud)

expression r

29
推荐指数
2
解决办法
2万
查看次数

如何在rmarkdown html文档中添加代码折叠到输出块

我非常欣赏RMarkdown中的"code_folding"功能.但是,我真正需要的是让代码始终显示并切换输出上的显示.

---
title: "test file"
author: "dayne"
date: "June 10, 2016"
output: 
  html_document:
    code_folding: hide
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

Here is a basic example.

```{r}
3 + 4
```
Run Code Online (Sandbox Code Playgroud)

有没有办法切换输出而不是代码?我想到的最好(但不是理想的)解决方案是添加collapse=TRUE到块中,但代码和输出仍然同时显示.

链接到已编译的文档:http://rpubs.com/daynefiler/188408

r r-markdown

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

如何组合do.call()plot()和expression()

当我尝试,并结合使用,我得到一个错误expressiondo.callplot.

 x <- 1:10
 y <- x^1.5
Run Code Online (Sandbox Code Playgroud)

我只使用plot函数可以得到我想要的情节:

plot(y~x,xlab=expression(paste("Concentration (",mu,"M)")))
Run Code Online (Sandbox Code Playgroud)

但是,我想用我的情节来实现do.call.我有一个很长的参数列表存储为列表,p.但是,当我尝试将列表传递给do.call我时,我收到以下错误:

p <- list(xlab=expression(paste("Concentration (",mu,"M)")))
do.call(plot,c(y~x,p))
Error in paste("Concentration (", mu, "M)") : 
  object 'mu' not found
Run Code Online (Sandbox Code Playgroud)

我还尝试在传递给的args中明确定义公式do.call.即.do.call(plot,c(formula=y~x,p)).我不明白为什么我收到错误 - 特别是因为以下内容没有出错:

do.call(plot,c(0,p))
Run Code Online (Sandbox Code Playgroud)

(并在xaxis中提供所需的mu字符).

plot expression r do.call

12
推荐指数
3
解决办法
788
查看次数

获取用户坐标中的边距线位置(mgp)

我试图做一些非传统的情节标签和想办法的转换line参数mtextaxis用户的坐标.

换句话说,我想将值转换par()$mgp为用户坐标.

这说明了问题:

setup_plot <- function() {
  par(mar = c(2, 10, 2, 2), oma = rep(2, 4))
  plot.new()
  plot.window(xlim = c(0, 1), ylim = c(0, 1))
  box(which = "plot", lwd = 2, col = "gray40")
  box(which = "figure", lwd = 2, col = "darkred")
  box(which = "outer", lwd = 2, col = "darkgreen")
  text(x = 0.5, y = 0.5, 
       labels = "Plot Region", 
       col = "gray40", font = 2)
  mtext(side = 3, …
Run Code Online (Sandbox Code Playgroud)

plot r

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

all.equal中的舍入问题

我正在阅读The R Inferno,并遇到了一些我不理解的事情.除了Inferno的第8.2.23节之外,还有一些关于比较浮点数的好问题:问题1,问题2.

但是,我仍在使用中遇到问题all.equal.使用默认值all.equal我得到的结果(大部分)正如我所料.

> all.equal(2,1.99999997)
[1] "Mean relative difference: 1.5e-08"
> all.equal(2,1.99999998) #I expected FALSE here
[1] TRUE
> all.equal(2,1.99999999)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

我不确定为什么在1.99999998函数会返回TRUE,但这与我指定容差级别的以下行为没有关系:

> all.equal(2,1.98,tolerance=0.01) #Behaves as expected
[1] "Mean relative difference: 0.01"
> all.equal(2,1.981,tolerance=0.01) #Does not behave as expected
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

此外,

> all.equal(2,1.980000000001,tolerance=0.01)
[1] TRUE 
Run Code Online (Sandbox Code Playgroud)

但是如果我们计算:

> diff(c(1.981,2))
[1] 0.019
Run Code Online (Sandbox Code Playgroud)

显然,

> diff(c(1.981,2)) >= 0.01
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

那么,为什么all.equal无法区分2和1.981,容差为0.01?

编辑

从文档中:通过首先计算两个数值向量的平均绝对差值来完成scale = NULL(默认值)的数值比较.如果这小于容差或不是有限的,则使用绝对差异,否则相对差异按平均绝对差异缩放. …

r

9
推荐指数
2
解决办法
268
查看次数

全局环境中的递归eval

我很难理解为什么我递归申请eval使用的尝试rapply不起作用.

我有一个嵌套的表达式列表:

# Some expressions   
expr1 <- quote(x <- x + 9)
expr2 <- quote(x <- x/2)
expr3 <- quote(x <- x + 3)
expr4 <- quote(x <- x * 3)

# Generate a nested list of expressions
exprs <- list(expr1, list(expr2, expr3), expr4)

# Initialize x, and attempt to eval the expressions
x <- 1
rapply(exprs, eval, envir = globalenv())
# Returns: [1] 10  5  8 24, but x is not changed.
Run Code Online (Sandbox Code Playgroud)

很明显,递归有效,但它没有像我指定的那样评估全局环境中的表达式.根据这个答案,我把列表弄平了,可以 …

r

8
推荐指数
1
解决办法
509
查看次数

获取日志空间中的边距线位置

在上一个问题中,我询问了如何在用户坐标中获取边距线位置.我以line2user功能的形式收到了很好的答案.但是,当x或y轴在对数刻度上时,我无法弄清楚如何修改函数.

我做了一些修改以适应对数刻度轴:

line2user <- function(line, side, log = "") {
  lh <- par('cin')[2] * par('cex') * par('lheight')
  x_off <- diff(grconvertX(0:1, 'inches', 'user'))
  y_off <- diff(grconvertY(0:1, 'inches', 'user'))
  usr <- par('usr') ## Added by me
  if (grepl("x", log)) usr[1:2] <- 10^usr[1:2] ## Added by me
  if (grepl("y", log)) usr[3:4] <- 10^usr[3:4] ## Added by me
  switch(side,
         `1` = usr[3] - line * y_off * lh,
         `2` = usr[1] - line * x_off * lh,
         `3` = usr[4] …
Run Code Online (Sandbox Code Playgroud)

plot r

8
推荐指数
1
解决办法
519
查看次数

嵌套函数环境选择

我正在编写一些用于执行重复任务的函数,但我正在尝试最小化加载数据的次数.基本上我有一个功能,它需要一些信息并制作一个情节.然后我有第二个函数循环并输出多个图到.pdf.在这两个函数中,我有以下代码行:

if(load.dat) load("myworkspace.RData")
Run Code Online (Sandbox Code Playgroud)

哪里load.dat是逻辑的,我需要的数据存储在myworkspace.RData中.当我调用循环的包装函数并输出多个图时,我不想在每次调用内部函数时重新加载工作区.我以为我可以在包装函数中加载一次工作区,然后内部函数可以访问该数据,但我得到一个错误,否则说明.

所以我的理解是当函数无法在其本地环境中找到变量时(在调用函数时创建),该函数将查找父环境中的变量.

我假设内部函数调用的父环境将是外部函数调用.显然这不是真的:

func1 <- function(...){
  print(var1)
}

func2 <- function(...){
  var1 <- "hello"
  func1(...)
}

> func2()
Error in print(var1) : object 'var1' not found
Run Code Online (Sandbox Code Playgroud)

在阅读了许多问题,语言手册和这篇真正有用的博客文章之后,我想出了以下内容:

var1 <- "hello"
save(list="var1",file="test.RData")
rm(var1)

func3 <- function(...){
  attach("test.RData")
  func1(...)
  detach("file:test.RData")
}

> func3()
[1] "hello"
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?为什么不在被调用func1的本地环境中查找未定义的变量?func2func2func1

注意:我不知道如何命名这个问题.如果有人有更好的建议,我会改变它并编辑这一行.

r function environment-variables

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

如何使用多个键定义data.table键以实现最快的聚合

我想更好地了解利用凯迪德data.table.阅读文档后,我想我了解如何在使用一个密钥时加快子集化.例如:

DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=c(1,3,6), v=1:9)
Run Code Online (Sandbox Code Playgroud)

方案一:

DT[x == "ad"]
Run Code Online (Sandbox Code Playgroud)

方案二:

setkey(DT,x)
DT["ad"]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,选项1比选项2慢得多,因为data.table使用键更有效地搜索(使用二进制搜索与矢量扫描,我不理解,但我相信会更快.)

在使用by语句聚合数据子集的情况下,定义密钥的最快方法是什么?我应该键入我用于对数据进行子集化的列,还是定义组的列?例如:

setkey(DT,x)
DT[!"bd",sum(v),by=y]
Run Code Online (Sandbox Code Playgroud)

要么

setkey(DT,y)
DT[!"bd",sum(v),by=y]
Run Code Online (Sandbox Code Playgroud)

是否有利用两个键的方式xy

编辑

是否设置了密钥xy执行两次矢量搜索?即:

setkey(DT,x,y)
Run Code Online (Sandbox Code Playgroud)

EDIT2

对不起,我打算问的是,DT[!"bd",sum(v),by=y]当DT被x和y键入时,调用会执行两次二进制扫描吗?

performance r compound-key data.table

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

从字符向量创建函数列表

在此先感谢,如果此问题已经得到回答,我很抱歉 - 我看起来非常广泛.我有一个数据集,其中包含一行连接信息,特别是:名称,颜色代码,一些函数表达式.例如,一个值可能是:

成本#FF0033 @日志(X)+6.

我有所有提取信息的代码,最后我得到了一个表达式向量,我想将其转换为实际函数列表.

例如:

func.list <- list()
test.func <- c("x","x+1","x+2","x+3","x+4")
Run Code Online (Sandbox Code Playgroud)

其中test.func是表达式的向量.我想要的是:

func.list[[3]]
Run Code Online (Sandbox Code Playgroud)

相当于

function(x){x+3}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用以下方法创建一个函数:

somefunc <- function(x){eval(parse(text="x+1"))} 
Run Code Online (Sandbox Code Playgroud)

将字符值转换为函数.当我尝试循环以创建多个函数时,问题就来了.我试过的一些例子不起作用:

for(i in 1:length(test.func)){
  temp <- test.func[i]
  f <- assign(function(x){eval(expr=parse(text=temp))})
  func.list[[i]] <- f
}
Run Code Online (Sandbox Code Playgroud)

基于另一篇文章(http://stats.stackexchange.com/questions/3836/how-to-create-a-vector-of-functions)我也试过这个:

makefunc <- function(y){y;function(x){y}}
for(i in 1:length(test.func)){
   func.list[[i]] <-  assign(x=paste("f",i,sep=""),value=makefunc(eval(parse(text=test.func[i]))))
 }
Run Code Online (Sandbox Code Playgroud)

这给出了以下错误:eval中的错误(expr,envir,enclos):找不到对象'x'

最终目标是获取函数列表并将第j个函数应用于data.frame的第j列,以便脚本用户可以指定如何规范化列标题给出的连接信息中的每一列.

r user-defined-functions

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