其中一个R最大的特点就是懒惰的评价.这导致了经常遇到的样式,即可以使用参数作为另一个参数的值.例如,在Hadley关于Advanced R的伟大着作中,您会看到以下示例:
g <- function(a = 1, b = a * 2) {
c(a, b)
}
g()
#> [1] 1 2
g(10)
#> [1] 10 20
Run Code Online (Sandbox Code Playgroud)
现在,我想用xlim和做同样的情节ylim,但是,它不起作用:
> plot(1, 1, ylim = c(0,1), xlim = ylim)
Error in plot.default(1, 1, ylim = c(0, 1), xlim = ylim) :
object 'ylim' not found
> plot(1, 1, xlim = c(0,1), ylim = xlim)
Error in plot.default(1, 1, xlim = c(0, 1), ylim …Run Code Online (Sandbox Code Playgroud) 我目前正在编写一个适合多项处理树模型的小包(对于不需要的背景信息,网页和pdf).
它的作用如下:它从文件中读取模型(即公式)并将它们(通过parse)转换为表达式.之后,这些表达式中的一些变量被另一个文件中的其他变量交换(即应用了模型限制).因此,模型被转换为字符(via as.character),并且交换是通过gsub.
问题:如果单个表达式超过500个字符,则通过as.character将它们截断为500个字符(或左右)来将它们转换回来.
?as.character得到:
as.character将语言对象的组件截断为500个字符(在1.3.1之前大约为70).
这是一个例子:
text1 <- paste(rep(LETTERS, 10), collapse = " + ")
nchar(text1)
[1] 1037
expr1 <- parse(text = text1)
text2 <- as.character(expr1)
[1] 504
Run Code Online (Sandbox Code Playgroud)
问题:你能解决这500个字符的限制吗?
我知道如果我们在第一次解析模型之前应用限制(即交换变量),我们就可以解决这个问题.但是,这将涉及大量编程,因为整个事情基本上已经准备就绪,如果我们能够以另一种方式解决这500个字符限制,那将会很棒.
问题:只要高阶参数(即交互)保留在模型中,我就无法删除模型中的低阶参数(例如,主效应参数).即使这样做,模型也会被重构,新模型不会嵌套在更高的模型中.
请参阅以下示例(因为我来自我使用的ANOVA contr.sum):
d <- data.frame(A = rep(c("a1", "a2"), each = 50), B = c("b1", "b2"), value = rnorm(100))
options(contrasts=c('contr.sum','contr.poly'))
m1 <- lm(value ~ A * B, data = d)
m1
## Call:
## lm(formula = value ~ A * B, data = d)
##
## Coefficients:
## (Intercept) A1 B1 A1:B1
## -0.005645 -0.160379 -0.163848 0.035523
m2 <- update(m1, .~. - A)
m2
## Call:
## lm(formula = value ~ B + A:B, data = d)
## …Run Code Online (Sandbox Code Playgroud) 我试图用acast从reshape2一个自写的函数中,但有这样的acast没有找到我发送给它的数据的问题.
这是我的数据:
library("reshape2")
x <- data.frame(1:3, rnorm(3), rnorm(3), rnorm(3))
colnames(x) <- c("id", "var1", "var2", "var3")
y <-melt(x, id = "id", measure = c("var1", "var2", "var3"))
Run Code Online (Sandbox Code Playgroud)
y 然后看起来像这样:
id variable value
1 1 var1 0.1560812
2 2 var1 1.0343844
3 3 var1 -1.4157728
4 1 var2 0.8808935
5 2 var2 0.1719239
6 3 var2 0.6723758
7 1 var3 -0.7589631
8 2 var3 1.1325995
9 3 var3 -1.5744876
Run Code Online (Sandbox Code Playgroud)
现在我可以通过acast以下方式将其丢回:
> acast(y,y[,1] ~ y[,2])
var1 var2 var3 …Run Code Online (Sandbox Code Playgroud) 为什么callNextMethod()不按预期将参数传递给下一个方法?
假设我有两个分层类foo和bar(bar是它的子类foo),我有一个foobar可以为两个类分派的方法(即,有两个类的方法).
此外,(子)类bar的方法foo在进行一些计算之后调用该方法callNextMethod().
两种方法都有相同的附加参数(默认值)应该传递给方法foo,只有它是相关的.
setClass("foo", representation(x = "numeric"))
setClass("bar", contains = "foo")
setGeneric("foobar", function(object, ...) standardGeneric("foobar"))
setMethod("foobar", "foo", function(object, another.argument = FALSE, ...) {
print(paste("in foo-method:", another.argument))
if (another.argument) object@x^3
else object@x^2
})
setMethod("foobar", "bar", function(object, another.argument = FALSE, ...) {
print(paste("in bar-method:", another.argument))
object@x <- sqrt(object@x)
callNextMethod()
})
Run Code Online (Sandbox Code Playgroud)
问题描述:
参数未按预期传递,但默认值取自方法定义.具体来说,在第一种方法中,参数是在call(TRUE)中指定的,但是,它会FALSE在下一个方法中更改.
o1 <- new("bar", …Run Code Online (Sandbox Code Playgroud) 我有一个R包,我将包含矩阵代数的MCMC算法移动到C++使用RcppEigen包,这大大提高了速度.
但是,在Linux上R CMD check给出以下NOTE内容(感谢R-Forge):
* checking installed package size ... NOTE
installed size is 6.6Mb
sub-directories of 1Mb or more:
libs 6.1Mb
Run Code Online (Sandbox Code Playgroud)
这个警告可能不是由我不可思议的C++代码大小(只有大约150行)驱动的,因为它只出现在Linux上,但可能是由于我无法正确配置Makevars文件.(我从未使用过make或makefile以前用过).
同样在提交包时CRAN,Brian Ripley写了一些关于这个问题NOTE,这让我觉得这是一个Makevars问题:"它来自调试符号."
我Makevars的标准Rcpp Makevars(如下所示)由我制作Rcpp.package.skeleton.
我的问题:
我的Makevars:
## Use the R_HOME …Run Code Online (Sandbox Code Playgroud) 我对 非常陌生Rcpp,或者更具体地说RcppEigen,我正在努力解决如何pi在我的代码中用作常量。代码在 MCMC 算法中运行了很多次,因此任何速度改进都是完美的。目前,我每次调用该函数时都会交出 pi,如下代码所示:
require(RcppEigen)
require(inline)
I.Cpp <- "
using Eigen::Map;
using Eigen::MatrixXd;
using Eigen::VectorXd;
using Rcpp::NumericVector;
const Map<MatrixXd> delta(as<Map<MatrixXd> >(delta0));
const Map<VectorXd> d(as<Map<VectorXd> >(DD));
const Rcpp::NumericVector tpi(pie);
double pi = tpi[0];
const MatrixXd I = delta.transpose() * d.asDiagonal() * pi * pi;
return wrap(I);
"
I.cpp <- cxxfunction(signature(delta0 = "matrix", DD = "numeric", pie = "numeric"), I.Cpp, plugin = "RcppEigen")
delta0 <- matrix(rnorm(25), 5)
DD <- rnorm(5)
I.cpp(delta0, DD, pi) # this …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方便的方法来创建列表中的列表具有连续数字的列表.到目前为止,我只想出了一个非常不满意的暴力打字解决方案(是的,我现在只使用python几周):
block0 = []
...
block4 = []
blocks = [block0,block1,block2,block3,block4]
Run Code Online (Sandbox Code Playgroud)
我感谢任何与之类似的帮助nrBlocks = 5.
我是一名行为科学家,通常通过让参与者在计算机上执行一些任务并记录他们的响应来收集数据(我使用pyglet包装器PsychoPy编写程序)。也就是说,程序在本地运行,数据存储在本地。
现在,我想知道是否有一种方法可以使用Python向用户显示带有html表单的(本地)网站,并(本地)收集输入。这种想法的原因是,当前每当我要显示复选框,单选按钮或输入字段时,我都会使用wxPython。这工作得很好,但是wxPython中的编程和布局有点麻烦,我更喜欢带有表单的html。
要求是它需要朗姆酒而没有任何边框,地址字段,菜单栏等。原因是我需要在全屏模式下使用(我目前以大小不等的方式打开非全屏pygflet窗口。屏幕以隐藏桌面),以便参与者只能执行表单上的操作。
因此,我正在寻找一种方法(a)在没有菜单栏或任何菜单的pyglet窗口上方显示html表单,包括html表单;(b)单击“确定”按钮时收集输入(即,表单已发送),( c)控制在查看本网站之前和之后显示的内容,并且(d)所有这些都应在本地进行!
我的想法是,当参与者在下面的示例图片中单击“发送”按钮并显示下一页时,将收集数据。

更新:我使用Windows(XP或7)。
我使用 Eigen 库在 C++ 中实现了 MCMC 算法。该算法的主要部分是一个循环,其中首先执行一些矩阵计算,然后获得结果矩阵的行列式并将其添加到输出中。例如:
MatrixXd delta0;
NumericVector out(3);
out[0] = 0;
out[1] = 0;
for (int i = 0; i < s; i++) {
...
delta0 = V*(A.cast<double>()-(A+B).cast<double>()*theta.asDiagonal());
...
I = delta0.determinant()
out[1] += I;
out[2] += std::sqrt(I);
}
return out;
Run Code Online (Sandbox Code Playgroud)
现在,在某些矩阵上,我不幸地观察到数值下溢,因此行列式输出为零(实际上不是)。
如何避免这种下溢?
一种解决方案是获取行列式的对数,而不是行列式。然而,
任何帮助是极大的赞赏。
我试着这样做:
x <- data.frame(1:20)
attach(x)
assign("x2",1:20,pos="x")
Run Code Online (Sandbox Code Playgroud)
但是,x$x2给我NULL.
随着x2我得到我想要的,但它不是data.frame的一部分.
附加x2到x手动将在这个简单的情况下工作,但不是在我需要的更复杂的情况下.我尝试assign在循环中循环assign调用中使用的varnames .