传递数据框并引用它以在 R 中的函数内部进行赋值
Pass data frame and reference it for assignment inside function in R
在通过函数传递数据帧后,我在赋值时遇到了问题。
实际功能要大得多,但下面是一个例子。
目标:如果四分之一列名称在 active_quarters 向量中,则什么也不做。如果不是,则将空白分配给数据框该列中的所有值。
我知道它试图明确地引用“some_data_frame”,但我正在消隐,双关语,关于如何在给定循环迭代的情况下正确分配空白。
代码:
library(dplyr)
active_quarters <- c("Q1", "Q2")
data_frame_dummy <- data.frame("Q1" = c(1:4),
"Q2" = c(5:8),
"Q3" = c(9:12),
"Q4" = c(13:16))
create_blanks<- function(quarters_list,some_data_frame){
for(qcols in c("Q1", "Q2", "Q3", "Q4")){
if(qcols %in% quarters_list){
next
}else{
some_data_frame[,qcols] <<- ""
}
} # End of quarter if/else
} # End of function
create_blanks(active_quarters, data_frame_dummy)
结果:
> create_blanks(active_quarters, data_frame_dummy)
Error in some_data_frame[, qcols] <<- "" :
object 'some_data_frame' not found
期望的结果:
> data_frame_dummy
Q1 Q2 Q3 Q4
1 1 5
2 2 6
3 3 7
4 4 8
这对你有用吗?如果要将 0 分配给不在 .col 参数中的列,则可以取消选择
library(tidyverse)
active_quarters <- c("Q1", "Q2")
data_frame_dummy <- data.frame("Q1" = c(1:4),
"Q2" = c(5:8),
"Q3" = c(9:12),
"Q4" = c(13:16))
data_frame_dummy |>
mutate(across(!active_quarters,.fns = ~ 0))
#> Note: Using an external vector in selections is ambiguous.
#> i Use `all_of(active_quarters)` instead of `active_quarters` to silence this message.
#> i See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
#> This message is displayed once per session.
#> Q1 Q2 Q3 Q4
#> 1 1 5 0 0
#> 2 2 6 0 0
#> 3 3 7 0 0
#> 4 4 8 0 0
由 reprex package (v2.0.1)
创建于 2022-01-23
除非绝对必要,否则尽量不要使用 <<-
。函数不应更改现有对象。所以只需要函数 return some_data_frame
然后根据需要显式分配它。
create_blanks<- function(quarters_list,some_data_frame){
for(qcols in c("Q1", "Q2", "Q3", "Q4")){
if(qcols %in% quarters_list){
next
}else{
some_data_frame[,qcols] <- ""
}
} # End of quarter if/else
some_data_frame
} # End of function
data_frame_dummy <- create_blanks(active_quarters, data_frame_dummy)
data_frame_dummy
Q1 Q2 Q3 Q4
1 1 5
2 2 6
3 3 7
4 4 8
在通过函数传递数据帧后,我在赋值时遇到了问题。 实际功能要大得多,但下面是一个例子。 目标:如果四分之一列名称在 active_quarters 向量中,则什么也不做。如果不是,则将空白分配给数据框该列中的所有值。
我知道它试图明确地引用“some_data_frame”,但我正在消隐,双关语,关于如何在给定循环迭代的情况下正确分配空白。
代码:
library(dplyr)
active_quarters <- c("Q1", "Q2")
data_frame_dummy <- data.frame("Q1" = c(1:4),
"Q2" = c(5:8),
"Q3" = c(9:12),
"Q4" = c(13:16))
create_blanks<- function(quarters_list,some_data_frame){
for(qcols in c("Q1", "Q2", "Q3", "Q4")){
if(qcols %in% quarters_list){
next
}else{
some_data_frame[,qcols] <<- ""
}
} # End of quarter if/else
} # End of function
create_blanks(active_quarters, data_frame_dummy)
结果:
> create_blanks(active_quarters, data_frame_dummy)
Error in some_data_frame[, qcols] <<- "" :
object 'some_data_frame' not found
期望的结果:
> data_frame_dummy
Q1 Q2 Q3 Q4
1 1 5
2 2 6
3 3 7
4 4 8
这对你有用吗?如果要将 0 分配给不在 .col 参数中的列,则可以取消选择
library(tidyverse)
active_quarters <- c("Q1", "Q2")
data_frame_dummy <- data.frame("Q1" = c(1:4),
"Q2" = c(5:8),
"Q3" = c(9:12),
"Q4" = c(13:16))
data_frame_dummy |>
mutate(across(!active_quarters,.fns = ~ 0))
#> Note: Using an external vector in selections is ambiguous.
#> i Use `all_of(active_quarters)` instead of `active_quarters` to silence this message.
#> i See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
#> This message is displayed once per session.
#> Q1 Q2 Q3 Q4
#> 1 1 5 0 0
#> 2 2 6 0 0
#> 3 3 7 0 0
#> 4 4 8 0 0
由 reprex package (v2.0.1)
创建于 2022-01-23除非绝对必要,否则尽量不要使用 <<-
。函数不应更改现有对象。所以只需要函数 return some_data_frame
然后根据需要显式分配它。
create_blanks<- function(quarters_list,some_data_frame){
for(qcols in c("Q1", "Q2", "Q3", "Q4")){
if(qcols %in% quarters_list){
next
}else{
some_data_frame[,qcols] <- ""
}
} # End of quarter if/else
some_data_frame
} # End of function
data_frame_dummy <- create_blanks(active_quarters, data_frame_dummy)
data_frame_dummy
Q1 Q2 Q3 Q4
1 1 5
2 2 6
3 3 7
4 4 8