gpt4 book ai didi

r - 提取运算符 `$` () 在函数内返回零长度向量

转载 作者:行者123 更新时间:2023-12-04 09:33:16 24 4
gpt4 key购买 nike

我在函数内部使用提取运算符 `$() 时遇到问题。如果我在循环之外遵循相同的逻辑,则问题不存在,因此我认为可能存在我不知道的范围界定问题。

一般设置:

## Make some fake data for your reproducible needs.
set.seed(2345)

my_df <- data.frame(cat_1 = sample(c("a", "b"), 100, replace = TRUE),
cat_2 = sample(c("c", "d"), 100, replace = TRUE),
continuous = rnorm(100),
stringsAsFactors = FALSE)
head(my_df)

我正在尝试动态重现这个过程:

index <- which(`$`(my_df, "cat_1") == "a")

my_df$continuous[index]

但是一旦我将这个逻辑编程到一个函数中,它就会失败:

## Function should take a string for the following:
## cat_var - string with the categorical variable name as it appears in df
## level - a level of cat_var appearing in df
## df - data frame to operate on. Function assumes it has a column
## "continuous".
extract_sample <- function(cat_var, level, df = my_df) {

index <- which(`$`(df, cat_var) == level)

df$continuous[index]

}

## Does not work.
extract_sample(cat_var = "cat_1", level = "a")

这是返回 numeric(0)。对我所缺少的有什么想法吗?也欢迎替代方法。

最佳答案

问题不在于函数,而在于 $ 处理输入的方式。

cat_var = "cat_1"
length(`$`(my_df,"cat_1"))
#> [1] 100
length(`$`(my_df,cat_var))
#> [1] 0

您可以改为使用 [[ 来实现您想要的结果。

cat_var = "cat_1"
length(`[[`(my_df,"cat_1"))
#> [1] 100
length(`[[`(my_df,cat_var))
#> [1] 100

更新

已经注意到,以这种方式使用 [[ 是丑陋的。它是。当你想写类似 lapply(stuff,'[[',1)

在这里,您可能应该将其写为 my_df[[cat_var]]

另外,this question/answer更详细地介绍了为什么 $ 不能按您希望的方式工作。

关于r - 提取运算符 `$` () 在函数内返回零长度向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50047770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com