我正在编写一个函数,该函数根据数据框中的多个字段来计算新列。该过程的一部分是在实际处理之前对输入字段之一的范围进行预检查。奇怪的是,我的预检查总是返回相同的值,即数据帧第一行的预检查结果。
请参见下面的示例,其中提供了我的函数的简化版本,其中仅包括检查。即使变量正确地传递给函数,并且每次都不同,但预检查的结果仍保持不变。我想念什么?
> 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"
答案 0 :(得分:0)
如果要在向量的每个元素上测试条件,则需要使用单个&
(而不是&&
)对向量?ifelse
进行矢量化。
来自?`&&`
“ ifelse”返回的值与“ test”具有相同的形状,即 填充从“是”或“否”中选择的元素 关于“测试”元素是“真”还是“假”。
来自&
“&”和“ &&”表示逻辑与,“ |”和“ ||”表示 逻辑或。较短的形式在 与算术运算符大致相同。较长的表格 从左到右评估,仅检查每个元素的第一个元素 向量。评估仅进行到确定结果为止。 较长的形式适用于编程控制流程和 通常在“ if”子句中首选。
简写&&
执行逐元素比较,而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
{{1}}