R-在数据帧上运行函数时的意外输出

R-在数据帧上运行函数时的意外输出,r,R,我正在编写一个函数,根据数据框中的几个字段计算一个新列。该过程的一部分是在实际处理之前对一个输入字段的范围进行预检查。奇怪的是,我的预检查总是返回相同的值,即数据帧第一行的预检查结果 请参阅下面的示例,其中包含my function的简化版本,其中仅包含检查。即使变量被正确地传递给函数,并且每次都不同,预检查的结果保持不变。我错过了什么 > my_function = function(x){ + print(paste(x, x < 32 && x > 0

我正在编写一个函数,根据数据框中的几个字段计算一个新列。该过程的一部分是在实际处理之前对一个输入字段的范围进行预检查。奇怪的是,我的预检查总是返回相同的值,即数据帧第一行的预检查结果

请参阅下面的示例,其中包含my function的简化版本,其中仅包含检查。即使变量被正确地传递给函数,并且每次都不同,预检查的结果保持不变。我错过了什么

> my_function = function(x){
+   print(paste(x, x < 32 && x > 0))
+   if (x < 32 && x > 0) {
+     # do_something ...
+   }
+ }
> 
> df = data.frame("A" = c(10,20,30,40), "B" = c(0,10,20,30), "C" = c(40,30,20,10))
> my_function(df$A)
[1] "10 TRUE" "20 TRUE" "30 TRUE" "40 TRUE"
> my_function(df$B)
[1] "0 FALSE"  "10 FALSE" "20 FALSE" "30 FALSE"
> my_function(df$C)
[1] "40 FALSE" "30 FALSE" "20 FALSE" "10 FALSE"
>我的函数=函数(x){
+打印(粘贴(x,x<32&&x>0))
+如果(x<32&&x>0){
+做点什么。。。
+   }
+ }
> 
>df=数据帧(“A”=c(10,20,30,40),“B”=c(0,10,20,30),“c”=c(40,30,20,10))
>my_函数(df$A)
[1] “10正确”“20正确”“30正确”“40正确”
>my_函数(df$B)
[1] “0错误”“10错误”“20错误”“30错误”
>my_函数(df$C)
[1] “40假”“30假”“20假”“10假”

如果要在向量的每个元素上测试条件,则需要使用单个
&
(而不是
&
)对
ifelse
进行向量化

?ifelse

“ifelse”返回与“test”形状相同的值,该值为 由从“是”或“否”中选择的元素填充,具体取决于 关于“test”的元素是“TRUE”还是“FALSE”

?`&&`

“&”和“&&”表示逻辑and,“|”和“||”表示逻辑and 逻辑或。较短的形式在中执行元素级比较 与算术运算符的方式大致相同。较长形式 从左到右求值,只检查每个元素的第一个元素 矢量。评估仅在确定结果之前进行。 较长的形式适用于编程控制流和 通常在“如果”条款中首选

缩写形式
&
执行元素级比较,而
&
仅计算向量的第一个元素


下面是一个基于您的
df

f1 <- function(x) if (x < 32 && x > 0) x + 100 else x - 100;
f2 <- function(x) ifelse(x < 32 & x > 0, x + 100, x - 100);

f1(df$A)
#[1] 110 120 130 140

f2(df$A)
#[1] 110 120 130 -60
f1 0)x+100其他x-100;
f2 0,x+100,x-100);
f1(df$A)
#[1] 110 120 130 140
f2(df$A)
#[1] 110 120 130 -60

否决投票人请解释否决投票的原因。如果我的帖子不清楚的话,我很乐意多加说明;这确实解决了老年退休金计划的问题(并被接受为答案),所以否决票似乎是没有根据的。@RHertel我感谢你的反馈;然而,OPs的问题不是如何返回
TRUE
/
FALSE
向量;如果你仔细阅读这个问题,你会注意到OPs
my_function
表示一个更复杂(我们不知道)的例程,它需要对向量中的值进行元素级比较;因此,问题实际上在于
ifelse
和单个
&
的使用;为了让答案对这里的其他人有用,它们应该适用于不同的/相关的问题。我承认我的例子有点“笨拙”,我会做一些改变来解决这个问题。否决票仍然没有根据。