我正在尝试编写一个函数来接受data.frame(x
)和a column
.该函数对x执行一些计算,然后返回另一个data.frame.我坚持使用最佳实践方法将列名传递给函数.
两个最小的例子fun1
和fun2
下面产生所需的结果,能够执行操作x$column
,使用max()
,例如,然而,两者都依赖于看似(至少对我而言)不优雅
substitute()
可能eval()
fun1 <- function(x, column){
do.call("max", list(substitute(x[a], list(a = column))))
}
fun2 <- function(x, column){
max(eval((substitute(x[a], list(a = column)))))
}
df <- data.frame(B = rnorm(10))
fun1(df, "B")
fun2(df, "B")
Run Code Online (Sandbox Code Playgroud)
我希望能够将该功能称为fun(df, B)
例如.我考虑但尚未尝试的其他选项:
column
为列号的整数.我认为这会避免substitute()
.理想情况下,该功能可以接受.with(x, get(column))
但是,即使它有效,我认为这仍然需要 substitute
formula()
和match.call()
,我都没有多少经验.子问题:do.call()
首选eval()
?
我正在尝试测试向量的所有元素是否彼此相等.我提出的解决方案似乎有点迂回,都涉及检查length()
.
x <- c(1, 2, 3, 4, 5, 6, 1) # FALSE
y <- rep(2, times = 7) # TRUE
Run Code Online (Sandbox Code Playgroud)
用unique()
:
length(unique(x)) == 1
length(unique(y)) == 1
Run Code Online (Sandbox Code Playgroud)
用rle()
:
length(rle(x)$values) == 1
length(rle(y)$values) == 1
Run Code Online (Sandbox Code Playgroud)
一个允许我包含容差值的解决方案,用于评估元素之间的"平等",这是避免FAQ 7.31问题的理想选择.
是否有我完全忽略的测试类型的内置函数?identical()
并all.equal()
比较两个R对象,因此它们在这里不起作用.
编辑1
以下是一些基准测试结果.使用代码:
library(rbenchmark)
John <- function() all( abs(x - mean(x)) < .Machine$double.eps ^ 0.5 )
DWin <- function() {diff(range(x)) < .Machine$double.eps ^ 0.5}
zero_range <- function() {
if (length(x) == 1) …
Run Code Online (Sandbox Code Playgroud) 使用新版ggplot2和scale,我无法弄清楚如何以科学计数法获得轴标签.例如:
x <- 1:4
y <- c(0, 0.0001, 0.0002, 0.0003)
dd <- data.frame(x, y)
ggplot(dd, aes(x, y)) + geom_point()
Run Code Online (Sandbox Code Playgroud)
给我
我想轴标签是0,5 x 10 ^ -5,1 x 10 ^ -4,1.5 x 10 ^ -4等.我无法弄清楚正确的组合scale_y_continuous()
和math_format()
(至少我认为那些是我需要的).
scale_y_log10()
日志转换轴,我不想要.scale_y_continuous(label = math_format())
只给我10 ^ 0,10 ^ 5e-5等等.我明白为什么后者给出了这个结果,但这不是我想要的.
我正在使用ggplot2_0.9.1和scales_0.2.1
我正在尝试使用dplyr包将函数应用于未被分组的data.frame中的所有列,我会这样做aggregate()
:
aggregate(. ~ Species, data = iris, mean)
Run Code Online (Sandbox Code Playgroud)
where mean
适用于所有不用于分组的列.(是的,我知道我可以使用聚合,但我正在尝试理解dplyr.)
我可以这样使用summarize
:
species <- group_by(iris, Species)
summarize(species,
Sepal.Length = mean(Sepal.Length),
Sepal.Width = mean(Sepal.Width))
Run Code Online (Sandbox Code Playgroud)
但有没有办法mean()
应用于所有未分组的列,类似于?的. ~
符号aggregate()
?我有一个我想要聚合的30列data.frame,所以写出单个语句并不理想.
我想在R包中包含一个预编译的PDF作为插图.PDF不是通过Sweave生成的.如果没有.Rnw进行处理,就不会\VignetteIndexEntry
导致通常自动生成index.html和Meta/vignette.rds
.
我创建了一个index.html inst/doc
被复制到doc
安装过程中.这已从主包帮助页面链接更正.但是,当我加载包并执行时browseVignettes("MyPackage")
,我得到了
No vignettes found by browseVignettes("MyPackage")
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为R显然无法知道包装有一个小插图.已安装的软件包没有Meta/vignette.rds
文件.我可以以某种方式让我的PDF出现browseVignettes()
吗?
pdfpages
如何在julia中生成常规的非整数序列?
我想要的 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
在MATLAB中,我会使用
0.1:0.1:1
Run Code Online (Sandbox Code Playgroud)
在R
seq(0.1, 1, by = 0.1)
Run Code Online (Sandbox Code Playgroud)
但是除了julia中的整数序列之外我找不到任何东西(例如1:10
).在文档中搜索"序列"只能提供有关字符串序列的信息.
我正在使用rapache和brew开发一个Web应用程序.在R代码中,我想使用RMySQL包来查询MySQL数据库,但我在质疑从R脚本中访问数据库登录详细信息的最佳方法.
根据PHP的类似问题的一些建议,一个想法是在交互式会话中执行以下操作以将连接详细信息保存到以下文件之外/var/www
:
con <- dbConnect(MySQL(), dbname = "mydb", user = "myuser", pass = "mypass")
save(con, file = "/home/myuser/sqlconnect.rda")
Run Code Online (Sandbox Code Playgroud)
然后在由rapache/brew运行的脚本中,加载.rda
文件:
<%
load("/home/myuser/sqlconnect.rda")
query <- "MY QUERY"
result <- dbGetQuery(con, query)
%>
Run Code Online (Sandbox Code Playgroud)
我还没有尝试过这种方法.我甚至不确定我的sqlconnect.rda
文件是否包含连接所需的所有信息.
是否有更安全的方式来设置dbConnect()
声明?
将dbConnect()
输出保存到文件不起作用,因为连接已超时.但是,从我的用户目录中包含source
一个.R
文件
library(RMySQL)
con <- dbConnect(MySQL(), dbname = "mydb", user = "myuser", pass = "mypass")
Run Code Online (Sandbox Code Playgroud)
确实有效.
但是,我不知道这种方法有多安全.
我收到了一个roxygenize()
我无法理解的错误.我有一个我的杂项函数包,其中.Rd文件是通过roxygen生成的.
错误是Error: titlerequires a value
,这表明没有@title
标签.但是文件中有一个@title
标签kmmisc-package.R
,所以我不确定是什么问题.
kmmisc-package.R
包含:
##' Miscellaneous Functions
##'
##' \tabular{ll}{
##' Package: \tab kmmisc\cr
##' Type: \tab Package\cr
##' Version: \tab 0.1-2\cr
##' Date: \tab 2011-10-06\cr
##' License: \tab GPL-2\cr
##' LazyLoad: \tab yes\cr
##' LazyData: \tab yes\cr
##' }
##'
##' @author Me \email{my@@email}
##'
##' Maintainer: Me \email{my@@email}
##'
##' @name kmmisc-package
##' @docType package
##' @title KM Misc
##' @keywords package
##'
NULL
Run Code Online (Sandbox Code Playgroud)
我正在使用R …
这个问题不是关于控制轴限制(我认为),而是控制轴线本身的长度.我正在尝试制作一个ggplot(以便我可以利用其漂亮的刻面功能),这类似于手动添加轴的基本R图.这些轴仅延伸到最后一个轴标签.
我试图模仿的一些设置数据和基本R类型的图:
library("ggplot2")
library("cowplot")
library("grid")
set.seed(5)
x <- rnorm(10)
y <- rnorm(10)
D <- data.frame(x, y)
plot(x, y, axes = FALSE)
axis(1)
axis(2)
Run Code Online (Sandbox Code Playgroud)
ggplot(D, aes(x, y)) +
geom_point()
Run Code Online (Sandbox Code Playgroud)
从cowplot
包中对ggplot的默认更改非常接近:
但是,我怎么能告诉ggplot只绘制直到最后一个轴标签的线,即使点位于该值之外(如在基础R图中)?
使用ggplot()
,我试图绘制ANCOVA的结果,其中两个线性分量的斜率是相等的:即,lm(y ~ x + A)
.默认行为geom_smooth(method = "lm")
是为每个因子的每个级别绘制单独的斜率和截距.例如,有两个级别A
library(ggplot2)
set.seed(1234)
n <- 20
x1 <- rnorm(n); x2 <- rnorm(n)
y1 <- 2 * x1 + rnorm(n)
y2 <- 3 * x2 + (2 + rnorm(n))
A <- as.factor(rep(c(1, 2), each = n))
df <- data.frame(x = c(x1, x2), y = c(y1, y2), A = A)
p <- ggplot(df, aes(x = x, y = y, color = A))
p + geom_point() + geom_smooth(method = "lm") …
Run Code Online (Sandbox Code Playgroud) 当我\usepackage{Sweave}
在beamer演示文稿的前言中包含时,beamer忽略对字体的更改,例如\usepackage{helvet}
.
这是一个最小的例子:
\documentclass[professionalfonts]{beamer}
\usepackage[T1]{fontenc}
\usepackage{helvet}
\usepackage{Sweave}
\begin{document}
\begin{frame}
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat.
\end{frame}
\end{document}
Run Code Online (Sandbox Code Playgroud)
文本设置在计算机现代,而不是helvetica.如果您注释掉\usepackage{Sweave}
,那么文本将在helvetica中设置.
因此我的问题是:有没有办法在包含Sweave内容的beamer演示文稿中更改字体?
我意识到我的示例不包含任何实际的"Sweable"R代码,但似乎并不重要,因为不需要的字体切换行为似乎是由Sweave.sty引起的.我的更大目标是使用pgfSweave和beamer,但我遇到了同样的问题.我想我已将其追踪到了\usepackage{Sweave}
.
这可能不是一个特定于git的问题,但它出现在git的上下文中.这个想法可能更广泛地适用于其他vcs.
我正在开发一个小项目,我目前是唯一的开发人员.我已经习惯了使用git,所以我想知道最佳实践.当我实现新功能/功能时,我发现我一次处理多个文件,它们的示例和文档,这样我的git状态可能会报告15个已更改的文件.但这些文件可能与项目的3个不同部分有关.
最好是将它们分成3个单独的部分,将相关文件保存在一起,以便以后可以返回并更容易找到这些提交.或者用适当的消息一次性提交它们同样容易?
我有一个20列的data.frame.前两个是因子,其余是数字.我想将前两列用作拆分变量,然后将其mean()
应用于其余列.
这似乎是一个快速而简单的工作ddply()
,但是,输出data.frame的结果不是我想要的.这是一个只有一列数据的最小示例:
Aa <- c(rep(c("A", "a"), each = 20))
Bb <- c(rep(c("B", "b", "B", "b"), each = 10))
x <- runif(40)
df1 <- data.frame(Aa, Bb, x)
ddply(df1, .(Aa, Bb), mean)
Run Code Online (Sandbox Code Playgroud)
输出是:
Aa Bb x
1 NA NA 0.5193275
2 NA NA 0.4491907
3 NA NA 0.4848128
4 NA NA 0.4717899
Warning messages:
1: In mean.default(X[[1L]], ...) :
argument is not numeric or logical: returning NA
Run Code Online (Sandbox Code Playgroud)
警告重复8次,大概每次拨打一次mean()
.我猜这是因为试图采取一个因素的平均值.我可以这样写:
ddply(df1, .(Aa, Bb), function(df1) mean(df1$x))
Run Code Online (Sandbox Code Playgroud)
要么
ddply(df1, .(Aa, …
Run Code Online (Sandbox Code Playgroud)