小编Hon*_*Ooi的帖子

R循环越来越慢

我很难理解为什么随着迭代次数的增加,这段代码(改编自R Benchmark 2.5)变得越来越慢(平均).

require(Matrix)  
c <- 0;
for (i in 1:100) {
  a <- new("dgeMatrix", x = rnorm(3250 * 3250), Dim = as.integer(c(3250, 3250)))
  b <- as.double(1:3250)

  invisible(gc())
  timing <- system.time({
    c <- solve(crossprod(a), crossprod(a, b))
  })
  print(timing)

  rm(a, b, c)
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例输出,从一次运行到下一次运行略有不同.

据我了解,没有什么应该保存从一个迭代到下一个,但时机慢慢地从1秒在最初的几个循环,以超过4秒钟,在以后的循环增加.你知道造成这种情况的原因,以及我如何解决这个问题?

将for循环切换为*apply似乎会产生类似的结果.

我知道代码没有经过优化,但它从一个广泛使用的基准到来,这取决于是什么原因导致这种行为,这可能表明其结果严重偏差(只迭代默认为3次).

我在Mac OS 10.8.4上运行R版本3.0.1(x86_64),内存为16 GB(大量免费).BLAS是OpenBLAS.

performance benchmarking r blas

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

.Rprofile和.First之间的区别

这可能很简单,但我仍感到沮丧,所以我很欣赏一些快速的解释.我已经广泛寻找一个合适的答案,但似乎找不到一个.

由于我的.Rprofile包含了每次打开Rstudio(或一般的R)时需要运行的所有命令,为什么我可以在.Rprofile中定义.First()函数?.First()的目的是什么?

举个例子,假设我的.Rprofile有以下几行:

.First <- function(){
  library(xts)
  cat("\nWelcome at", date(), "\n") 
}
Run Code Online (Sandbox Code Playgroud)

上面简单地在我的.Rprofile中有以下不同之处:

library(xts)
cat("\nWelcome at", date(), "\n") 
Run Code Online (Sandbox Code Playgroud)

我试过了两个,他们确实有相同的结果.

谢谢!

r

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

r中不包括NA的列长度

假设我有data.frame如下:

   a  b c
1  5 NA 6
2 NA NA 7
3  6  5 8
Run Code Online (Sandbox Code Playgroud)

我想找到每列的长度,不包括NA.答案应该是这样的

a b c 
2 1 3 
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试过:

 !is.na()                  # Gives TRUE/FALSE
 length(!is.na())          # 9 -> Length of the whole matrix
 dim(!is.na())             # 3 x 3 -> dimension of a matrix
 na.omit()                 # removes rows with any NA in it.
Run Code Online (Sandbox Code Playgroud)

请告诉我如何获得所需的答案.

r

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

将Null更改为NA的函数

我正在尝试编写一个将Null值变为NA的函数.我的一个专栏的摘要如下所示:

      a   b 
 12 210 468 
Run Code Online (Sandbox Code Playgroud)

我想将12个空值更改为NA.我还有一些其他因素列,我想将Null值更改为NA,所以我从这里和那里借了一些东西来提出这个:

# change nulls to NAs
nullToNA <- function(df){

  # split df into numeric & non-numeric functions
  a<-df[,sapply(df, is.numeric), drop = FALSE]
  b<-df[,sapply(df, Negate(is.numeric)), drop = FALSE]

  # Change empty strings to NA
  b<-b[lapply(b,function(x) levels(x) <- c(levels(x), NA) ),] # add NA level
  b<-b[lapply(b,function(x) x[x=="",]<- NA),]                 # change Null to NA

  # Put the columns back together
  d<-cbind(a,b)
  d[, names(df)]
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

> foo<-nullToNA(bar)  
Error in x[x == "", ] <- NA : incorrect …
Run Code Online (Sandbox Code Playgroud)

r function missing-data na

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

SQL Server用户太多

我们有一台运行SQL Server的虚拟机.今天我想在框中添加一个用户,我注意到有20个SQL Server Windows用户.我不知道这些来自哪里.描述说Local user account for execution of R scripts in SQL Server instance MSSQLSERVER

任何人都知道这些帐户似乎突然出现了什么?如果删除它们会发生什么?

在此输入图像描述

sql-server r user-accounts sql-server-2016

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

在dplyr 0.7.0+中正确使用dplyr :: select,使用字符向量选择列

假设我们有一个cols_to_select包含我们想要从数据帧中选择的列的字符向量df,例如

df <- tibble::data_frame(a=1:3, b=1:3, c=1:3, d=1:3, e=1:3)
cols_to_select <- c("b", "d")
Run Code Online (Sandbox Code Playgroud)

假设我们也想使用dplyr::select它,因为它是使用的操作的一部分,%>%因此使用select使代码易于阅读.

似乎有很多方法可以实现,但有些方法比其他方法更强大.请你告诉我哪个是"正确的"版本,为什么?或许还有另一种更好的方法?

dplyr::select(df, cols_to_select) #Fails if 'cols_to_select' happens to be the name of a column in df 
dplyr::select(df, !!cols_to_select) # i.e. using UQ()
dplyr::select(df, !!!cols_to_select) # i.e. using UQS()

cols_to_select_syms <- rlang::syms(c("b", "d"))  #See [here](https://stackoverflow.com/questions/44656993/how-to-pass-a-named-vector-to-dplyrselect-using-quosures/44657171#44657171)
dplyr::select(df, !!!cols_to_select_syms)
Run Code Online (Sandbox Code Playgroud)

ps我意识到这可以简单地在基础R中实现 df[,cols_to_select]

r dplyr tidyverse tidyeval rlang

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

无法用比较器初始化std :: function

在我的C++类中,我们学习使用函数对象等,但现在我们得到了一个代码片段,可以在教师编译器上运行,但不在我们的编译器上(我们使用不同的操作系统).

我们使用几个编译器(MSVC,clang)测试了下面的代码片段,他们都拒绝了它,有点最小化:

#include <functional>

struct Fraction {
  Fraction();
  Fraction(int z, int n);
  Fraction(Fraction&);

  // various data members
};

struct FractionComparator {
  int operator()(Fraction a, Fraction b) {
    return 1;
  }
};

int main() {
  std::function<int(Fraction, Fraction)> comparator = FractionComparator();
}
Run Code Online (Sandbox Code Playgroud)

我们对macOS表示赞同:

No viable conversion from 'FractionComparator' to 'function<int (Fraction, Fraction)>'
Run Code Online (Sandbox Code Playgroud)

我们已经发现添加移动构造函数可以解决问题,但是我们不知道为什么存在这种差异以及为什么这些代码不能在我们的编译器上编译.

有任何想法吗?

c++ c++11

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

参数默认值出现意外行为

我只是遇到了一些奇怪的东西,希望这里有人可以解释一下.基本上,当一个函数有一个参数的默认值是参数的名字时,会发生奇怪的事情(好吧,对我来说很奇怪).

例如:

y <- 5

f <- function(x=y) x^2

f2 <- function(y=y) y^2
Run Code Online (Sandbox Code Playgroud)

我会考虑f并且f2是等同的; 虽然它们在内部使用不同的变量名称,但它们都应该y在全局环境中拾取对象以用作默认值.然而:

> f()
[1] 25

> f2()
Error in y^2 : 'y' is missing
Run Code Online (Sandbox Code Playgroud)

不知道为什么会这样.

只是为了让事情变得更有趣:

f3 <- function(y=y) y$foo

> f3()
Error in f3() : 
  promise already under evaluation: recursive default argument reference or earlier problems?
Run Code Online (Sandbox Code Playgroud)

我期望f3抛出一个错误,但不是那个!

这是在32位Windows XP SP3上的R 2.11.1,2.12.2和2.14上测试的.仅加载标准包.

r

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

如何检测rlang中的空状态?

f <- function(x) enquo(x)

e <- f()
#<quosure: empty>
#~
Run Code Online (Sandbox Code Playgroud)

这些都不起作用:

> is_empty(e)
[1] FALSE
> is_missing(e)
[1] FALSE
> is_false(e)
[1] FALSE
> is_quosure(e)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

r tidyverse rlang

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

基于quosure命名新变量

我正在尝试编写一个自定义函数,它将根据预定义变量向量(例如vector_heavy)的值计算新变量,然后根据提供给函数的参数(例如,custom_name)命名新变量.

这个变量命名是我的技能失败的地方.任何帮助是极大的赞赏.

library(tidyverse)

vector_heavy <- quos(disp, wt, cyl)

cv_compute <- function(data, cv_name, cv_vector){
  cv_name <- enquo(cv_name)
  data %>% 
    rowwise() %>% 
    mutate(!!cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>% 
    ungroup()
}

d <- cv_compute(mtcars, cv_name = custom_name, cv_vector = vector_heavy)
Run Code Online (Sandbox Code Playgroud)

我的错误消息是:

Error: unexpected '=' in:
"    rowwise() %>% 
    mutate(!!cv_name ="
Run Code Online (Sandbox Code Playgroud)

删除!!之前cv_namemutate()将导致一个函数计算一个字面命名的新变量cv_name,并忽略custom_name我作为参数包含的内容.

cv_compute <- function(data, cv_name, cv_vector){
  cv_name <- enquo(cv_name)
  data %>% 
    rowwise() %>% 
    mutate(cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>% 
    ungroup() 
} …
Run Code Online (Sandbox Code Playgroud)

r dplyr tidyverse rlang

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