仍然试图进入R逻辑...解压缩(在LHS上)返回多个值的函数的结果的"最佳"方法是什么?
我显然不能这样做:
R> functionReturningTwoValues <- function() { return(c(1, 2)) }
R> functionReturningTwoValues()
[1] 1 2
R> a, b <- functionReturningTwoValues()
Error: unexpected ',' in "a,"
R> c(a, b) <- functionReturningTwoValues()
Error in c(a, b) <- functionReturningTwoValues() : object 'a' not found
Run Code Online (Sandbox Code Playgroud)
我真的必须做以下事吗?
R> r <- functionReturningTwoValues()
R> a <- r[1]; b <- r[2]
Run Code Online (Sandbox Code Playgroud)
或者R程序员会写更像这样的东西:
R> functionReturningTwoValues <- function() {return(list(first=1, second=2))}
R> r <- functionReturningTwoValues()
R> r$first
[1] 1
R> r$second
[1] 2
Run Code Online (Sandbox Code Playgroud)
---编辑回答谢恩的问题---
我真的不需要给结果值部分命名.我申请一个聚合函数的第一个组件和其他到第二组件(min和max,如果它是我不需要分裂他们两个组件功能相同).
是否可以动态创建新的变量名称?
我想将列表中的数据帧读入最后带数字的新变量.像orca1,orca2,orca3 ......
如果我尝试类似的东西
paste("orca",i,sep="")=list_name[[i]]
Run Code Online (Sandbox Code Playgroud)
我收到这个错误
target of assignment expands to non-language object
Run Code Online (Sandbox Code Playgroud)
还有另一种方法吗?
我想在R中的一行中分配多个变量.是否可以这样做?
values # initialize some vector of values
(a, b) = values[c(2,4)] # assign a and b to values at 2 and 4 indices of 'values'
Run Code Online (Sandbox Code Playgroud)
通常我想在一行中分配大约5-6个变量,而不是多行.还有其他选择吗?
我看到实用的Common Lisp使用(defvar *db* nil)设立一个全局变量.是否可以setq用于同一目的?
使用defvarvs. 的优点/缺点是setq什么?
这篇文章(在R中的懒惰评估是指派受影响吗?)涵盖了一些共同点,但我不确定它是否回答了我的问题.
我assign在apply很久以前发现这个家庭的时候就停止了使用,虽然,纯粹出于以下情况的优雅原因:
names.foo <- letters
values.foo <- LETTERS
for (i in 1:length(names.foo))
assign(names.foo[i], paste("This is: ", values.foo[i]))
Run Code Online (Sandbox Code Playgroud)
可以替换为:
foo <- lapply(X=values.foo, FUN=function (k) paste("This is :", k))
names(foo) <- names.foo
Run Code Online (Sandbox Code Playgroud)
这也是本(其理由http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f)R-FAQ说这应该避免.
现在,我知道这assign通常是不受欢迎的.但还有其他原因我不知道吗?我怀疑它可能会与范围或懒惰的评估混乱,但我不确定?演示此类问题的示例代码将非常棒.
我最近发现了大熊猫"分配"方法,我发现它非常优雅.我的问题是新列的名称被指定为关键字,因此它不能包含空格或破折号.
df = DataFrame({'A': range(1, 11), 'B': np.random.randn(10)})
df.assign(ln_A = lambda x: np.log(x.A))
A B ln_A
0 1 0.426905 0.000000
1 2 -0.780949 0.693147
2 3 -0.418711 1.098612
3 4 -0.269708 1.386294
4 5 -0.274002 1.609438
5 6 -0.500792 1.791759
6 7 1.649697 1.945910
7 8 -1.495604 2.079442
8 9 0.549296 2.197225
9 10 -0.758542 2.302585
Run Code Online (Sandbox Code Playgroud)
但是如果我想将新列命名为"ln(A)"呢?例如
df.assign(ln(A) = lambda x: np.log(x.A))
df.assign("ln(A)" = lambda x: np.log(x.A))
File "<ipython-input-7-de0da86dce68>", line 1
df.assign(ln(A) = lambda x: np.log(x.A))
SyntaxError: keyword …Run Code Online (Sandbox Code Playgroud) 有一个固定大小的矢量矢量,
vector<vector<int> > v(10);
Run Code Online (Sandbox Code Playgroud)
我想初始化它,以便它在所有元素中都有一个具有初始化值的一维向量(例如1).
我使用了Boost Assign如下
v= repeat(10,list_of(list_of(1)));
Run Code Online (Sandbox Code Playgroud)
我有一个编译错误
error: no matching function for call to ‘repeat(boost::assign_detail::generic_list<int>)’
Run Code Online (Sandbox Code Playgroud)
你能告诉我怎么做吗?提前致谢
虽然我是一名长期的C程序员,但我最近才知道可以直接将结构变量分配给另一个而不是使用memcpy:
struct MyStruct a,b;
...
a = b; /* implicit memcpy */
Run Code Online (Sandbox Code Playgroud)
虽然这对于C感觉有点"高级",但它绝对有用.但为什么我不能做平等和不平等比较:
if (a == b) ...
if (a != b) ...
Run Code Online (Sandbox Code Playgroud)
标准是否有任何理由排除这种情况?或者这是一个不一致的 - 否则非常优雅 - 标准?
我不明白为什么我可以替换我的memcpy用于干净的任务,但我必须保持那些丑陋的memcmp到位.
这一天发布的帖子让我想知道如何在函数中为全局环境中的多个对象赋值.这是我的尝试使用lapply(assign可能比<<-我更安全,但我从未实际使用它,我不熟悉它).
#fake data set
df <- data.frame(
x.2=rnorm(25),
y.2=rnorm(25),
g=rep(factor(LETTERS[1:5]), 5)
)
#split it into a list of data frames
LIST <- split(df, df$g)
#pre-allot 5 objects in R with class data.frame()
V <- W <- X <- Y <- Z <- data.frame()
#attempt to assign the data frames in the LIST to the objects just created
lapply(seq_along(LIST), function(x) c(V, W, X, Y, Z)[x] <<- LIST[[x]])
Run Code Online (Sandbox Code Playgroud)
请随意缩短我的代码的任何/所有部分以使其工作(或更好/更快地工作).
更新2 @G.格洛腾迪克发布了两种方法.第二个是改变函数内的函数环境.这解决了我的编码重复过多的问题.在将脚本编写成包时,我不确定这是否是通过CRAN检查的好方法.当我得出一些结论时,我会再次更新.
更新
我试图传递很多输入参数变量,f2并且不想索引函数内的每个变量env$c, env$d, env$calls,这就是我尝试使用within f5和f6(修改过f2)的原因.但是,assign不能在with里面工作{},移动assign到外面with会做的工作,但在我的实际情况下,我有几个assigns在with表达式内,我不知道如何with轻松地将它们移出功能.
这是一个例子:
## In the <environment: R_GlobalEnv>
a <- 1
b <- 2
f1 <- function(){
c <- 3
d <- 4
f2 <- function(P){
assign("calls", calls+1, inherits=TRUE)
print(calls)
return(P+c+d)
}
calls <- 0
v <- vector()
for(i in 1:10){
v[i] <- f2(P=0)
c <- c+1
d …Run Code Online (Sandbox Code Playgroud)