我有什么理由可以使用
map(<list-like-object>, function(x) <do stuff>)
Run Code Online (Sandbox Code Playgroud)
代替
lapply(<list-like-object>, function(x) <do stuff>)
Run Code Online (Sandbox Code Playgroud)
输出应该是相同的,我做的基准似乎表明它lapply稍微快一些(它应该是map需要评估所有非标准评估输入).
那么有什么理由为什么这么简单的情况我应该考虑切换到purrr::map?我不是在这里问一个人对于语法,purrr等提供的其他功能的喜欢或不喜欢,而是严格地purrr::map与lapply假设使用标准评估的比较,即map(<list-like-object>, function(x) <do stuff>).purrr::map在性能,异常处理等方面是否有任何优势?下面的评论表明它没有,但也许有人可以详细说明一点?
将已使用定义的属性添加到R对象可以很容易地携带与感兴趣对象粘合在一起的一些附加信息.问题是它稍微改变了R看到对象的方式,例如具有附加属性的数字向量仍然是numeric但vector不再是:
x <- rnorm(100)
class(x)
## [1] "numeric"
is.numeric(x)
## [1] TRUE
is.vector(x)
## [1] TRUE
mode(x)
## [1] "numeric"
typeof(x)
## [1] "double"
attr(x, "foo") <- "this is my attribute"
class(x)
## [1] "numeric"
is.numeric(x)
## [1] TRUE
is.vector(x)
## [1] FALSE # <-- here!
mode(x)
## [1] "numeric"
typeof(x)
## [1] "double"
Run Code Online (Sandbox Code Playgroud)
这会导致任何潜在的问题吗?我正在考虑的是向常见的R对象添加一些属性,然后将它们传递给其他方法.仅因为我在标准R对象中添加了额外属性(例如矢量,矩阵,数据帧等)这一事实,有什么东西可以破坏?
请注意,我不是要求创建自己的类.为简单起见,我们还可以假设属性名称中没有任何冲突(例如使用dims属性).让我们假设如果某些方法在某些方面会使我的属性失效,那就不是问题,这是一个可接受的风险.
是否有任何理由为什么我应该更喜欢Rcpp::NumericVector过std::vector<double>?
例如,下面的两个功能
// [[Rcpp::export]]
Rcpp::NumericVector foo(const Rcpp::NumericVector& x) {
Rcpp::NumericVector tmp(x.length());
for (int i = 0; i < x.length(); i++)
tmp[i] = x[i] + 1.0;
return tmp;
}
// [[Rcpp::export]]
std::vector<double> bar(const std::vector<double>& x) {
std::vector<double> tmp(x.size());
for (int i = 0; i < x.size(); i++)
tmp[i] = x[i] + 1.0;
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
在考虑其工作和基准性能时是等效的.我知道Rcpp提供了糖和矢量化操作,但是如果只是将R的向量作为输入并将向量作为输出返回,那么我使用哪一个会有什么区别吗?std::vector<double>在与R交互时可以使用导致任何可能的问题吗?
假设我想训练BaggingClassifier那种用途DecisionTreeClassifier:
dt = DecisionTreeClassifier(max_depth = 1)
bc = BaggingClassifier(dt, n_estimators = 500, max_samples = 0.5, max_features = 0.5)
bc = bc.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)
我想用GridSearchCV找到两者的最佳参数BaggingClassifier和DecisionTreeClassifier(如max_depth从DecisionTreeClassifier和max_samples从BaggingClassifier),究竟是什么语法?
我正在学习Cython.我有将numpy数组传递给Cython的问题,并且不太了解发生了什么.你可以帮帮我吗?
我有两个简单的数组:
a = np.array([1,2])
b = np.array([[1,4],[3,4]])
Run Code Online (Sandbox Code Playgroud)
我想计算它们的点积.在python/numpy一切正常:
>>> np.dot(a,b)
array([ 7, 12])
Run Code Online (Sandbox Code Playgroud)
我将代码翻译成Cython(如下所示:http://docs.cython.org/src/tutorial/numpy.html ):
import numpy as np
cimport numpy as np
DTYPE = np.int
ctypedef np.int_t DTYPE_t
def dot(np.ndarray a, np.ndarray b):
cdef int d = np.dot(a, b)
return d
Run Code Online (Sandbox Code Playgroud)
它编译没有问题但返回错误:
>>> dot(a,b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.pyx", line 8, in test.dot (test.c:1262)
cdef int d = np.dot(a, b)
TypeError: only length-1 arrays can be converted to …Run Code Online (Sandbox Code Playgroud) 这两个功能应该给出类似的结果,不是吗?
f1 <- function(x, y) {
if (missing(y)) {
out <- x
} else {
out <- c(x, y)
}
return(out)
}
f2 <- function(x, y) ifelse(missing(y), x, c(x, y))
Run Code Online (Sandbox Code Playgroud)
结果:
> f1(1, 2)
[1] 1 2
> f2(1, 2)
[1] 1
Run Code Online (Sandbox Code Playgroud) 我有一个测试包来检查可能会或可能不会返回警告的函数,例如:
test_that("test", {
expect_true(is.na(log(NA)))
expect_true(is.na(log(-1)))
})
Run Code Online (Sandbox Code Playgroud)
我对检查天气出现警告不感兴趣.有没有一种方法,我怎么能告诉testthat给忽略了警告,并且运行时不显示出来devtools::test()?
我知道我可以打包每个功能expect_warning,或者suppressWarnings,但我喜欢做类似的事情
test_that("test", {
ignoreAllTheWarningsInside({
expect_true(is.na(log(NA)))
expect_true(is.na(log(-1)))
})
})
Run Code Online (Sandbox Code Playgroud)
不幸的是options(warn = -1),这似乎也没有用.
我们来看一个简单的代码:
y = [1,2,3]
def plusOne(y):
for x in range(len(y)):
y[x] += 1
return y
print plusOne(y), y
a = 2
def plusOne2(a):
a += 1
return a
print plusOne2(a), a
Run Code Online (Sandbox Code Playgroud)
'y'的值发生变化但值'a'保持不变.我已经知道这是因为一个是可变的而另一个不是.但是如何更改代码以使函数不更改列表?
例如,要做类似的事情(为了简单起见,使用伪代码):
a = [1,2,3,...,n]
function doSomething(x):
do stuff with x
return x
b = doSomething(a)
if someOperation(a) > someOperation(b):
do stuff
Run Code Online (Sandbox Code Playgroud)
编辑:抱歉,我在嵌套列表上有另一个问题.看到这段代码:
def change(y):
yN = y[:]
for i in range(len(yN)):
if yN[i][0] == 1:
yN[i][0] = 0
else:
yN[i][0] = 1
return yN …Run Code Online (Sandbox Code Playgroud) 我有两张桌子:table1和table2.我可以使用id1或加入他们id2.我更喜欢使用id1,但因为在某些行id1中缺少,所以我必须使用id2.以下语法是否正确:
SELECT *
FROM table1 as a
LEFT JOIN table2 as b
ON (a.id1 is not null and a.id1 = b.id1) or
(a.id2 is not null and a.id2 = b.id2)
Run Code Online (Sandbox Code Playgroud)
它会返回一些结果,但我想确定它是否有效,因为我之前没有看过它.
有没有更好的方法来做到这一点?
Hadley Wickham提出可以使用dplyr包进行引导,他的建议得到了改进,然后在broom包中实现.是否也可以实现k折交叉验证?
我想第一步(选择火车组)非常简单:
crossvalidate <- function (df, k = 5) {
n <- nrow(df)
idx <- sample(rep_len(1:k, n))
attr(df, "indices") <- lapply(1:k, function(i) which(idx != i))
attr(df, "drop") <- TRUE
attr(df, "group_sizes") <- nrow(df) - unclass(table(idx))
attr(df, "biggest_group_size") <- max(attr(df, "group_sizes"))
attr(df, "labels") <- data.frame(replicate = 1:k)
attr(df, "vars") <- list(quote(replicate))
class(df) <- c("grouped_df", "tbl_df", "tbl", "data.frame")
df
}
Run Code Online (Sandbox Code Playgroud)
但不知怎的,我无法找到任何attr(, "indices")可以学习的文档,如果它可能在某种程度上可以使用"其他那些"选择用于选择测试组索引的索引.你有什么想法?